如何替换变量然后执行命令

时间:2019-01-08 14:24:57

标签: shell sh

我正在尝试创建一个Shell脚本,以检索所有JIRA问题的值并将其存储在文件中。在这里,我希望能够在执行变量之前先对其进行解释。

我尝试了几种替代方法,并用尽了所有的选择。我使用单引号,双引号甚至转义了美元符号字符。甚至exec命令,但它们都不起作用

var1="project in (ELIP)"

./jira.sh --action getIssueList --jql "$var1"  --columns "Key" --outputFormat 999  --file "/root/scripts/getList.txt" 

注意:命令./jira.sh期望--jql参数用双引号引起来。

我期望的是,应该首先解释$var1的值,然后再运行./jira.sh命令。但是我无法使其正常工作。

1 个答案:

答案 0 :(得分:0)

好吧,我不知道jira.sh到底是做什么的,但这是有关shell变量的一些解释(用bash测试,其他shell的行为可能有所不同):

首先使用测试脚本来告知如何接收参数:

$ cat test.sh 
#!/bin/bash
echo arg1: $1
echo arg2: $2
echo arg3: $3

现在,如果我们使用文字文本参数(无变量)运行

$ ./test.sh arg_no_1 'multiple words argument' arg_no_3
arg1: arg_no_1
arg2: multiple words argument
arg3: arg_no_3

现在我们定义变量(单引号)

$ variable='multiple words variable'

如果不带引号运行,则会得到错误的输出,变量将以bash扩展并占用下一个参数的位置:

$ ./test.sh arg_no_1 $variable arg_no_3
arg1: arg_no_1
arg2: multiple
arg3: words

如果我们尝试将其用简单的引号引起来,则不会解释该变量,而是将其作为文字发送给脚本。

$ ./test.sh arg_no_1 '$variable' arg_no_3
arg1: arg_no_1
arg2: $variable
arg3: arg_no_3

但是用双引号引起来会产生预期的结果:

$ ./test.sh arg_no_1 "$variable" arg_no_3
arg1: arg_no_1
arg2: multiple words variable
arg3: arg_no_3

您应该阅读报价用法。简短的解释:在shell中,单引号'被视为文字内容,并且不解释其中的变量。将双引号"视为要解释的内容,并将其内部的变量替换为其值。这是tldp上有关报价的一些信息。另外,gnu.org包含信息。