【发布时间】:2020-03-23 19:51:59
【问题描述】:
我有以下 bash 脚本,似乎 -n 标志在 echo 中总是被解释为字符串
echo Hello, who am I talking to?
read login_name
login_name=$(echo -n $login_name | base64)
echo $login_name | base64 --decode
我该如何纠正,或者我的脚本还有其他更好的语法吗?
【问题讨论】:
我有以下 bash 脚本,似乎 -n 标志在 echo 中总是被解释为字符串
echo Hello, who am I talking to?
read login_name
login_name=$(echo -n $login_name | base64)
echo $login_name | base64 --decode
我该如何纠正,或者我的脚本还有其他更好的语法吗?
【问题讨论】:
最好使用更便携的printf 而不是echo -n 并使用read -p 并正确引用;
read -p 'Hello, who am I talking to? ' login_name
login_name=$(printf '%s' "$login_name" | base64)
printf '%s' "$login_name" | base64 --decode
echo
PS:只是为了澄清在$(...) 中使用任何标志并没有什么特别之处,因此可以像这样使用它:
dt=$(date -u '+%Y/%m/%d')
echo "$dt"
【讨论】:
$(...) 没有什么特别之处。可以使用:dt=$(date -u '+%Y/%m/%d')
$( )无关,与echo有关。 echo 的某些版本,如果它们的第一个参数以“-”开头,则将其解释为标志。有些没有。基本上,尝试将标志选项传递给echo 或将其与以“-”开头的字符串一起使用是不安全的。 printf 使用起来更复杂,但更可预测和可控。