无法打印与 $1 相同的参数
#!/bin/bash
if [[ "$1" =~ ^((-{1,2})([Hh]$|[Hh][Ee][Ll][Pp])|)$ ]]; then
display_help; exit 1
else
while [[ $# -gt 0 ]]; do
opt="$1"
shift;
current_arg="$1"
case "$opt" in
"run_command" ) RUN_COMMAND="$1"; shift;;
"cmd1" ) CMD1="$1"; shift;;
* ) echo "ERROR: Invalid option: \""$opt"\"" >&2
exit 1;;
esac
done
fi
if [[ "$RUN_COMMAND" == "Custom" ]];then
export command1=`echo $CMD1`
echo $command1
else
echo "Invalid arguments"
fi
结果输出
./test_non.sh run_command Custom cmd1 "date|awk '{print \\$1}'"
date|awk '{print \}'
答案1
首先,当你运行这个命令时:
./script run_command Custom cmd1 "date|awk '{print $1}'"
因为你的命令在双引号中,这意味着它将被 shell (bash) 扩展前调用你的脚本。你始终可以使用以下方法测试这些内容set -x
:
$ set -x
$ ./script run_command Custom cmd1 "date|awk '{print $1}'"
+ ./script run_command Custom cmd1 'date|awk '\''{print $1}'\'''
date|awk '{print $1}'
以 开头的行+
显示实际运行的命令。如您所见,$1
消失了,因为$
表示 shell 变量,并且由于所有内容都用双引号括起来,因此 被传递给 shell,shell 会尝试对其进行扩展。由于$1
未设置,因此它会扩展为空。将其与使用已设置的变量时发生的情况进行比较:
$ foo="bar"
$ ./script run_command Custom cmd1 "date|awk '{print $foo}'"
+ ./script run_command Custom cmd1 'date|awk '\''{print bar}'\'''
date|awk '{print bar}'
如您所见,$foo
awk 命令中的扩展为bar
前被传递给./script
。因此,您需要转义$1
:
$ ./script run_command Custom cmd1 "date|awk '{print \$1}'"
+ ./script run_command Custom cmd1 'date|awk '\''{print $1}'\'''
date|awk '{print $1}'
我也不明白这应该做什么:
if [[ "$RUN_COMMAND" == "Custom" ]];then
export command1=`echo $CMD1`
echo $command1
else
你不需要 export
完全不需要,你也不需要回显一个变量来将其设置为另一个变量的值。你只需要:
if [[ "$RUN_COMMAND" == "Custom" ]];then
command1=$CMD1
事实上,你$CMD1
根本不需要。只需$command1
从头开始设置即可。这是你的脚本的一个稍微改进的版本:
#!/bin/bash
## dummy function since you didn't include yours
display_help(){
echo "help"
}
if [[ "$1" =~ ^((-{1,2})([Hh]$|[Hh][Ee][Ll][Pp])|)$ ]]; then
display_help
exit 1
else
while [[ $# -gt 0 ]]; do
opt="$1"
shift;
current_arg="$1"
case "$opt" in
"run_command")
RUN_COMMAND="$1"
shift
;;
"cmd1")
command1="$1"
shift
;;
*)
echo "ERROR: Invalid option: '$opt'" >&2
exit 1
;;
esac
done
fi
if [[ "$RUN_COMMAND" == "Custom" ]];then
echo "$command1"
else
echo "Invalid arguments"
fi
答案2
你应该使用
./script run_command Custom cmd1 "date|awk '{print \\$1}'"
为什么?我真的不知道 double 的原因\
,但可能需要转义特殊字符$
和参数编号(一个\
用于$
and 1
)
以下是一些结果:
好的:
damadam@Pc:~$ export command1=`echo "date|awk '{print \\$1}'"` damadam@Pc:~$ echo $command1 date|awk '{print $1}'
测试:
damadam@Pc:~$ export command1=`echo "date|awk '{print \$\1}'"` damadam@Pc:~$ echo $command1 date|awk '{print $\1}' damadam@Pc:~$ export command1=`echo "date|awk '{print $\1}'"` damadam@Pc:~$ echo $command1 date|awk '{print $\1}'
OP 测试:
damadam@Pc:~$ export command1=`echo "date|awk '{print \$1}'"` damadam@Pc:~$ echo $command1 date|awk '{print }'
编辑 1:使用 OP 提供的示例脚本代码(我将其命名test.sh
为亲自测试),只需要一个\
即可转义$1
参数
damadam@Pc:~$ ./test.sh run_command Custom cmd1 "date|awk '{print \$1}'"
date|awk '{print $1}'