如何在shell中同时定义和打印变量值

时间:2018-01-18 12:32:53

标签: linux bash shell

我在一个bash脚本中面临问题,因为我打印了一个变量的值,然后使用该变量作为另一个变量的输入,但是值没有得到打印,因为据我所知我已经为变量赋值然后可以打印。 所以我想知道我可以同时定义和打印变量值,并将值存储在函数范围内的另一个变量中。

对于前。

a="My name is Vikas"  
echo "a=My name is Vikas"  
b="${a} Singh"  
echo "b=${a} Singh"

但我想做以下

echo "a=My name is Vikas"  
echo "b=${a} Singh" 

所以输出应该像

a=My name is Vikas  
b=My name is Vikas Singh.

请帮忙

3 个答案:

答案 0 :(得分:4)

在案例变量尚未设置的情况下进行扩展时可以完成赋值

a= b=
echo "a=${a:=My name is Vikas}"
echo "b=${b:=${a} Singh}"

from manual

  

$ {参数:=字}   如果参数未设置或为null,则将字的扩展分配给参数。然后替换参数的值。不能以这种方式分配位置参数和特殊参数。

一段时间之后,我意识到这可能会产生误导:它是echo "a=.."正在进行分配但是扩展,这使我能够以不同的方式理解问题,分配(像任何其他命令一样)可以跟{{1}进行跟踪。 1}}或set -x(撤消set -o xtraceset +x)(另一个类似选项set +o xtraceset -v在展开前显示命令)

set -o verbose

将在扩展到(文件描述符2)标准错误后写入赋值。

答案 1 :(得分:3)

您当然可以将变量的内容打印到另一个变量中。要打印的命令是printf,选项-v将打印到变量。从手册页:

   printf [-v var] format [arguments]
          Write the formatted arguments to the standard output under the control of
          the format.  The -v option causes the output to be assigned to  the  vari-
          able var rather than being printed to the standard output.

因此...

$ fname="Vikas"; lname="Singh"
$ printf -v a 'My name is %s' "$fname"
$ printf -v b '%s %s' "$a" "$lname"
$ printf '%s\n%s\n' "$a" "$b"
My name is Vikas
My name is Vikas Singh

但是如果您希望输出包含变量名称,则应该使用declare -p

$ declare -p a b
declare -- a="My name is Vikas"
declare -- b="My name is Vikas Singh"

通过使用declare -p,您的输出可以作为输入再循环,以便将来重新创建相同的变量。

答案 2 :(得分:2)

我认为你试图做这样的事情。

b="${a='My name is Vikas'} Singh"
echo $a
echo $b

花括号{}中的命令在当前shell中设置变量a,外部分配设置b

Bash manual

编辑:实际上,正如Nauhel指出的那样,不应该设置变量。所以它应该以{{1​​}}开头。