簡體   English   中英

將變量作為命令運行時,如何阻止 bash 剝離引號?

[英]How do you stop bash from stripping quotes when running a variable as a command?

我有一個命令存儲在一個變量中,然后我運行:

[root@cxpxwly01wel001 init.d]# cat test
#!/bin/bash
command="su - root -c 'java -Xms16m -the_rest_of_my_java_command'"
echo $command
$command
[root@cxpxwly01wel001 init.d]# ./test
su - root -c 'java -Xms16m -the_rest_of_my_java_command'
su: invalid option -- 'X'
Try `su --help' for more information.

如果單引號不存在,則會出現 su 錯誤:

[root@cxpxwly01wel001 init.d]# su - root -c java -Xms16m -the_rest_of_my_java_command
su: invalid option -- 'X'
Try `su --help' for more information.

使用單引號,命令按預期工作:

[root@cxpxwly01wel001 init.d]# su - root -c 'java -Xms16m -the_rest_of_my_java_command'
-bash: java: command not found

這向我表明,當將變量作為命令運行時,不會保留單引號。 我該如何保存它們?

注意:我正在編輯一個現有的腳本(在 java 命令周圍插入 su -),所以我想盡可能少地更改以使其接近源代碼。


讓我在使用set -x運行時添加輸出:

+ command='su - root -c '\''java -Xms16m -the_rest_of_my_java_command'\'''
+ echo su - root -c ''\''java' -Xms16m '-the_rest_of_my_java_command'\'''
su - root -c 'java -Xms16m -the_rest_of_my_java_command'
+ su - root -c ''\''java' -Xms16m '-the_rest_of_my_java_command'\'''
su: invalid option -- 'X'
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

我用來避免“在引號內引用”問題的技術是在數組中構建命令。 例如,而不是:

command="su - root -c 'java -Xms16m -the_rest_of_my_java_command'"

我會用:

declare -a command=(su - root -c 'java -Xms16m -the_rest_of_my_java_command')

您仍然可以回顯命令(使用數組擴展):

echo "${command[@]}"

或者運行它:

"${command[@]}"

數組擴展周圍的雙引號很重要:它們告訴 shell 在不進行任何分詞的情況下擴展項目,因此包含空格的項目將保持其身份為單個字符串。

通過這樣做,引號內的最后一個參數將保留為單個字符串,並且su命令不會將-Xms16m視為(無效)選項。

順便說一句,在[@]"${command[@]}"的意思是“所有數組中的元素”。 而在像"${command[1]}"這樣的表達式中, [1]表示“僅索引 1 處的元素”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM