为什么我$x从下面的摘录中得到不同的值? #!/bin/bash x=1 echo fred > junk ; while read var ; do x=55 ; done < junk echo x=$x # x=55 .. I'd expect this result x=1 cat junk | while read var ; do x=55 ; done echo x=$x # x=1 .. but why? x=1 echo fred | …
#!/bin/bash VALUE=10 if [[ VALUE -eq 10 ]] then echo "Yes" fi 令我惊讶的是,输出为“是”。我本来期望它需要[[ $VALUE -eq 10 ]]。我已经扫描了的CONDITIONAL EXPRESSIONS部分man bash,但没有找到任何能解释这种行为的信息。
${!FOO}在中执行双重替换bash,这意味着它接受FOO的(字符串)值并将其用作变量名。 zsh不支持此功能。 有没有一种方法,使这项工作同样在bash和zsh? 背景: 我有一个环境变量列表,例如 PATH MAIL EDITOR 并想先打印变量名,然后再打印它们的值。 这适用于bash但不适用zsh: for VAR in LIST do echo $VAR echo ${!VAR} done 应该可以通过某种方式实现“旧方法” eval,但是我无法使其正常工作: for VAR in LIST do echo $VAR echo `eval \$$VAR` done 我永远也不会理解为什么我不能简单地进行像${${VAR}}或什至${${${VAR}}}需要这样的任意深度替换,因此对此做一个解释也很好。
我正在查看具有以下内容的脚本: if [ "${PS1-}" ]; then 这个尾部-让我有些烦恼,因为它似乎不符合Posix或Bash标准语法。这是一些永远存在的奥秘语法,还是错别字?对标准/文档的任何引用将不胜感激。 通常我会编写代码: if [ "$PS1" ]; then 哪个更正确或它们之间有区别?
我可以做到这一点,但是它需要对变量进行字符串处理然后再取消引用。有什么办法可以将其简化为更简单的陈述? #!/bin/bash FRUITS="BANANA APPLE ORANGE" BANANA_COLOUR="Yellow" APPLE_COLOUR="Green or Red" ORANGE_COLOUR="Blue" for fruit in $( echo $FRUITS ); do fruit_colour="${fruit}_COLOUR" echo $fruit is ${!fruit_colour} done 我尝试了很多类似${!"${fruit}_COLOUR"}或\$${fruit}_COLOUR和其他许多变体的方法,但是唯一有效的方法是使用字符串。