如何在参数中打印 $

如何在参数中打印 $

无法打印与 $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}'

如您所见,$fooawk 命令中的扩展为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}'

相关内容