PATH=/opt/omd/sites/icinga/var/TEST
FLAG="$PATH/$1_$3.flag" | tr -d \'
我$3
有单引号,我想删除它,因此上面的tr -d \'
.
接下来,我跑了:
/bin/touch $FLAG
并得到:
/bin/touch: missing file operand Try '/bin/touch --help' for more information.
我也尝试过
/bin/touch "$FLAG"
但出现no such file or directory
错误。有人可以指导我吗?
答案1
你有两个问题:
首要问题:
你的变量赋值不起作用就像你想的那样:
FLAG="$PATH/$1_$3.flag" | tr -d \'
这是由 分隔的两个命令pipe
,这意味着您将第一个命令的输出(变量赋值)发送到第二个命令 ( tr
)。第二个命令将简单地输出结果。由于变量赋值的输出为空,因此 的输出tr
也为空。
变量赋值实际上是有效的,但由于它是 a 的一部分,所以pipe
它在单独的进程中运行,并且主进程(包括之后的命令(例如touch
))无法访问它。
包括命令在内的变量赋值必须使用命令替换:
FLAG="$(printf '%s' "$PATH/$1_$3.flag" | tr -d \')"
第二期是你覆盖你的PATH
变量:
PATH=/opt/omd/sites/icinga/var/TEST
FLAG="$PATH/$1_$3.flag" | tr -d \'
现在,tr
将无法工作并给出以下错误:
tr: command not found
我什至得到了一个很好的附加信息,但这可能是bash
Ubuntu:
Command 'tr' is available in the following places
* /bin/tr
* /usr/bin/tr
The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.
要解决这个问题,也不要遇到类似问题, 跟着bash 变量命名约定:
path=/opt/omd/sites/icinga/var/TEST
flag="$(printf '%s' "$path/$1_$3.flag" | tr -d \')"