[英]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.