我对Bash中括号,括号,花括号的用法以及它们的双重或单一形式之间的区别感到困惑.有明确的解释吗?
我已经看到bash脚本以两种不同的方式测试非零长度字符串.大多数脚本使用-n选项:
#!/bin/bash
# With the -n option
if [ -n "$var" ]; then
# Do something when var is non-zero length
fi
Run Code Online (Sandbox Code Playgroud)
但是-n选项并不是真正需要的:
# Without the -n option
if [ "$var" ]; then
# Do something when var is non-zero length
fi
Run Code Online (Sandbox Code Playgroud)
哪种方式更好?
同样,这是测试零长度的更好方法:
if [ -z "$var" ]; then
# Do something when var is zero-length
fi
Run Code Online (Sandbox Code Playgroud)
要么
if [ ! "$var" ]; then
# Do something when var is zero-length
fi
Run Code Online (Sandbox Code Playgroud) 我想保存发布每个命令的当前目录以及历史记录中的命令.为了不搞乱,我考虑在行尾添加当前目录作为注释.一个例子可能有帮助:
$ cd /usr/local/wherever
$ grep timmy accounts.txt
Run Code Online (Sandbox Code Playgroud)
我希望bash将最后一个命令保存为:
grep timmy accounts.txt # /usr/local/wherever
Run Code Online (Sandbox Code Playgroud)
这个想法是这样我可以立即看到我发出命令的位置.
我正在尝试编写一个Bash脚本,该脚本在case语句中使用变量作为模式.但是我无法让它发挥作用.
案例陈述:
case "$1" in
$test)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
Run Code Online (Sandbox Code Playgroud)
我已经试过分配此$test为aaa|bbb|ccc,(aaa|bbb|ccc),[aaa,bbb,ccc]和其他几个组合.我也尝试了这些作为case语句的模式:@($test),@($(echo $test)),$($test).也没有成功.
编辑
为清楚起见,我希望变量代表多个这样的模式:
case "$1" in
aaa|bbb|ccc)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
Run Code Online (Sandbox Code Playgroud) 我想实现一个bash函数,test是第一个参数实际上是一个变量,在某处定义.
例如,在我的.bashrc:
customPrompt='yes';
syntaxOn='no';
[...]
function my_func {
[...]
# I want to test if the string $1 is the name of a variable defined up above
# so something like:
if [[ $$1 == 'yes' ]];then
echo "$1 is set to yes";
else
echo "$1 is not set or != to yes";
fi
# but of course $$1 doesn't work
}
Run Code Online (Sandbox Code Playgroud)
需要输出:
$ my_func customPrompt
> customPrompt is set to yes
$ my_func syntaxOn
> syntaxOn is …Run Code Online (Sandbox Code Playgroud) 单词"true"和"false"是bash的特殊单词(builtins).如果在if测试中使用,它们可以直观地预期:
$ if true; then echo "true"; else echo "false"; fi
true
$ if false; then echo "true"; else echo "false"; fi
false
Run Code Online (Sandbox Code Playgroud)
但是,这两个测试:
$ [[ true ]] && echo "true" || echo "false"
true
$ [[ false ]] && echo "true" || echo "false"
true
Run Code Online (Sandbox Code Playgroud)
两者都是真的.为什么?