什么"设置 - $ VARIABLE"在bash中意味着什么?

时间:2017-08-17 16:40:05

标签: bash shell

接下来,我在第7章"阅读用户输入"中阅读Learning the bash Shell, 3rd Edition。当我 请参阅下面的代码,

echo 'Select a directory:'
done=false

while [ $done = false ]; do
        do=true
        num=1
        for direc in $DIR_STACK; do
                echo $num) $direc
                num=$((num+1))
        done
        echo -n 'directory? '
        read REPLY

        if [ $REPLY -lt $num ] && [ $REPLY -gt 0 ]; then
                set - $DIR_STACK

                #statements that manipulate the stack...

                break
        else
                echo 'invalid selection.'
        fi
done

set - $DIR_STACK的确切含义是什么?

1 个答案:

答案 0 :(得分:4)

这将对$DIR_STACK的内容进行字符串拆分和全局展开,将第一个放在$1中,将第二个放在$2中等等。这不是一个好习惯 - 编写良好的脚本不依赖于字符串拆分(请参阅BashPitfalls顶部的建议,下面的许多错误都是由于没有注意到这些建议而引起的。)

使用--而不是-写得更恰当。这由POSIX Utility Syntax Guidelines,条目#10:

定义
  

应该接受不是option-argument的第一个--参数作为指示选项结束的分隔符。以下任何参数都应被视为操作数,即使它们以-字符开头。

使用set更改参数列表($1$2等)也是specified by POSIX,尽管(再次)标准指定-- },而不是-

  

应为位置参数分配剩余的参数 [ed:after processing options] 。应设置特殊参数#以反映位置参数的数量。在分配任何新值之前,应取消设置所有位置参数。

     

如果第一个参数以--+开头,或者为了防止无意中列出所有shell,可以使用紧跟set命令名后面的特殊参数-来分隔参数没有参数时的变量。不带参数的命令set --将取消设置所有位置参数并将特殊参数#设置为零。