无法使用 /bin/touch $FLAG 创建文件,遇到的错误是 /bin/touch:缺少文件操作数

无法使用 /bin/touch $FLAG 创建文件,遇到的错误是 /bin/touch:缺少文件操作数
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

我什至得到了一个很好的附加信息,但这可能是bashUbuntu:

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 \')"

相关内容