![while [ -n "$1" ]; 开始的循环何时开始执行?](https://linux22.com/image/146500/while%20%5B%20-n%20%22%241%22%20%5D%3B%20%E5%BC%80%E5%A7%8B%E7%9A%84%E5%BE%AA%E7%8E%AF%E4%BD%95%E6%97%B6%E5%BC%80%E5%A7%8B%E6%89%A7%E8%A1%8C%EF%BC%9F.png)
我有一个以 while 循环开头的 shell 脚本
while [ -n "$1" ]; do
我知道 that$1
指的是脚本名称后面的参数,即firstargument
当我执行时./myscript.sh firstargument
。是做什么的-n
?
答案1
这-n
是对非空字符串的测试。
如果"$1"
扩展为空字符串,则该特定测试失败并且循环将不会执行。
这是可能循环体包含shift
将下一个位置参数移入的语句$1
,并且以这种方式循环遍历脚本的参数,直到找到空参数或到达参数列表的末尾。
该test
实用程序相当于[
,但[
要求最后一个参数是]
。
测试也可以写成
while test -n "$1"; do
[
和都test
可能内置在您的 shell 中,但也应该在标准路径(如/bin
.
您将能够在man test
以及 shell 手册(因为它是内置实用程序)中阅读有关此测试和其他测试的更多信息。
此次-n
测试也是其中之一标准测试,因此也列出在test
实用程序的 POSIX 标准。
如果这个循环应该循环结束全部shell 脚本的参数,如果参数为空,则可能无法执行此操作:
$ sh -c 'while [ -n "$1" ]; do printf "arg: %s\n" "$1"; shift; done' sh 1 2 3 "" 4 5 6
arg: 1
arg: 2
arg: 3
相反,它应该使用类似的东西
for arg do
if [ -n "$arg" ]; then
# do something with "$arg"
fi
done
...显然取决于脚本的作用。