接下来,我在第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
的确切含义是什么?
答案 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 --
将取消设置所有位置参数并将特殊参数#
设置为零。