你好,我是新来的,正在学习shell命令。当我尝试将其作为单行命令时,它是有效的,但当我将命令和路径存储到两个变量中并调用它时,它不起作用。
google-chrome /home/bashscripts/index.html
输出:chrome-opens/home/bashscripts/index.html(WORKS(
我想通过变量实现的目标:
A="google-chrome"
B="/home/bashscripts/index.html"
$C= echo $(eval $A) $B **(DOESNOT WORK)**
echo $C
输出:bash打开googlechrome空白新选项卡,但html文件未打开。
这将起作用:
#!/bin/bash
A="google-chrome"
B="/home/bashscripts/index.html"
"$A" "$B"
但是,我建议不要将命令(如google-chrome
(存储在变量中;对于像这样的简单命令可以这样做,但对于复杂的命令往往会失败。变量用于数据(如封地(,而不用于可执行命令。此外,使用小写或混合大小写的变量名通常更安全,因为有一堆具有特殊含义的全大写名称,如果你不小心将其中一个用于其他用途,你可能会遇到麻烦。
脚本中的其他一切都不必要地复杂,而且大多数都是错误的:
- 要在变量中存储内容,请使用
varname=$(command)
,而不是$varname= command
——$
和=
后面的空格都会更改命令的含义,并且需要$( )
来捕获命令的输出 - 此外,您几乎不应该使用
$(echo something)
,因为echo
和$( )
基本上相互抵消 - 而且,您不应该在没有充分理由的情况下捕获命令的输出。如果你只想打印输出(例如
echo $C
(,那么跳过捕获它,让它直接打印 - 当你确实需要打印一个变量,或者在几乎任何上下文中实际使用它时,你应该在它周围加上双引号,以避免奇怪的解析(例如
echo "$C"
而不是echo $C
( - 除非你是shell解析的专家,否则不要使用
eval
。这基本上是对奇怪的解析错误的邀请,实际上几乎没有必要
最后,我建议您通过shellcheck.net运行脚本,因为它会指出许多常见的脚本错误。
您的脚本应该是:
A="google-chrome"
B="/home/bashscripts/index.html"
C=$(eval $A $B)
echo "$C"
变量分配