关于Linux Shell';而';命令

关于Linux Shell';而';命令,linux,shell,Linux,Shell,代码: 我想获取路径的每个部分。当运行脚本时,它无法脱离while进程。请告诉我原因。“while[-n$path]”中有问题吗?最终剪切不会产生空字符串。如果你有a:b:c,你会先去掉a,然后去掉b,但永远不会去掉c。即: path=$PATH: while [ -n $path ] do ls -ld ${path%%:*} path=${path#*:} done 将始终为路径的最后一段生成非空字符串。由于-n检查查找空字符串,因此循环将永远运行。最终剪切不会导致空字符串。如果你有a:

代码:


我想获取路径的每个部分。当运行脚本时,它无法脱离while进程。请告诉我原因。“while[-n$path]”中有问题吗?

最终剪切不会产生空字符串。如果你有a:b:c,你会先去掉a,然后去掉b,但永远不会去掉c。即:

path=$PATH:
while [ -n $path ]
do 
ls -ld ${path%%:*}
path=${path#*:}
done

将始终为路径的最后一段生成非空字符串。由于-n检查查找空字符串,因此循环将永远运行。

最终剪切不会导致空字符串。如果你有a:b:c,你会先去掉a,然后去掉b,但永远不会去掉c。即:

path=$PATH:
while [ -n $path ]
do 
ls -ld ${path%%:*}
path=${path#*:}
done

将始终为路径的最后一段生成非空字符串。由于-n检查查找空字符串,因此循环将永远运行。

如果
$path
中没有冒号,
${path\*:}
将返回
$path
。所以你有一个无限循环

${path#*:}

如果
$path
中没有冒号,
${path}*:}
将返回
$path
。所以你有一个无限循环

${path#*:}

您的代码中有一些bug。这应该可以做到:

p="foo"
$ echo ${p#*:}
foo
$ p="foo:bar"
$ echo ${p#*:}
bar

您的
路径
初始化后,将始终检查
True
中的
[-n路径]
测试。这是您在循环时始终无法退出
的主要原因。

您的代码中有一些错误。这应该可以做到:

p="foo"
$ echo ${p#*:}
foo
$ p="foo:bar"
$ echo ${p#*:}
bar

您的
路径
初始化后,将始终检查
True
中的
[-n路径]
测试。这就是为什么你在
循环中始终无法摆脱
的主要原因。

很抱歉,我忘了在代码'path=$path'之后添加':'奇怪,现在我明白你的意思了。好吧,试试
-z$path
而不是
-n$path
。看起来不错。啊,现在我明白了。您需要在变量周围加引号:
-n“$path”
如果不加引号,它将等价于“
而[-n]
当$path为空时。这是正确的。感谢您的帮助。我想知道当我忘记添加引号时,为什么循环仍然输出“.”但是你说$path是空的。很抱歉,我忘了在代码'path=$path'后面加上':'。奇怪,现在我明白你的意思了。好吧,试试
-z$path
而不是
-n$path
。看起来不错。啊,现在我明白了。您需要在变量周围加引号:
-n“$path”
如果不加引号,它将等价于“
而[-n]
当$path为空时。这是正确的。感谢您的帮助。我想知道当我忘记添加引号时,为什么循环仍然输出“.”但是,您说$path为空。echo$path | tr:“\012”|同时读取d;do ls-ld${d:-.};doneecho$PATH | tr:“\012”|同时读取d;do ls-ld${d:-.};完成