我对bash编程有点挣扎,因为我似乎不理解语法规则.例如:
read confirm
if [ "$confirm" == "yes" ]; then
echo "Thank you for saying yes"
else
echo "Why did you say no?"
fi
Run Code Online (Sandbox Code Playgroud)
在此代码中,您可以使用许多表单来执行相同的操作:
"$confirm" == "yes"
$confirm == "yes"
"$confirm" == yes
$confirm == yes
Run Code Online (Sandbox Code Playgroud)
那么规则是什么?除此之外,它非常严格,所以如果你在'['和'''之间没有空格的情况下编写上面的if语句,你就会收到错误.所以我的问题是:
此致,
拉菲德
Sor*_*gal 12
规则很简单但很微妙.你给出的例子并不完全等同,它们的含义略有不同.有关相当好的参考,您可以阅读Shell命令语言,它涵盖了POSIX shell.大多数shell,当然包括bash,zsh和ksh,都是POSIX shell,并且至少会实现那里列出的内容.某些shell可能符合规范的早期版本或类似但不符合要求.
如果您正在学习Unix shell脚本,则需要记住的主要规则是:表达式由空格分隔.从技术上讲,它们由变量$ IFS中列出的任何字符分隔,但在正常情况下这相当于空格.
如果你["$a"="$b"]在bash中说shell试图将整个字符串作为一个命令读取,那么就要评估$ a和$ b.假设值$a是文字a,值$b是文字b,shell将尝试执行一个名为[a=b]的合法文件名命令.引号被shell解释为特殊但[不是,因为它只是作为单独的标记写入时才特殊.它没有被空格分隔.
您在shell中看到和执行的几乎所有操作都是命令.字符[不是语法,它是一个命令.命令采用以空格分隔的参数.这些参数意味着什么取决于命令,而不是shell.在C if ( a == b )中,除了a和b的值之外,它都由解析器处理.在bash if [ "$a" == "$b" ]中首先由shell解析,它评估变量$ a和$ b,然后[执行命令.有时这是一个shell内置命令,有时它实际上是一个单独的可执行文件(/bin/[在你的系统中查找).这意味着它a == b ]根本不被bash解释,而是一种由特定于域的语言解释[,也被称为test.实际上你可以改写if test "$a" == "$b".以这种形式test不需要关闭],但其他一切都是一样的.要了解test这些参数将如何处理,请阅读help test或man test.
学习Unix shell脚本时需要记住的另一条规则是:首先扩展变量,然后评估命令.这意味着如果变量中有空格,foo="a b"那么shell将在变量展开后看到空格:ls $foo它本身会抱怨它无法找到该文件a而无法找到该文件b.为了获得您可能期望从其他语言中获得的行为,您几乎总是希望引用您的变量:ls "$foo",它指示shell将扩展变量视为单个字符串而不是重新标记化.
Shell脚本充满了奇怪的东西,但它并非不合理(至少在大多数情况下不是这样).一些历史性的疣确实存在,但是一旦掌握了基础知识,就没有太多的规则可以记住.只是不要指望它像传统的C语言一样操作,你不会太惊讶.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |