Bash - 日期命令和空间

VGe*_*rge 5 linux bash date

我正在尝试创建一个在bash中使用date命令的脚本.我熟悉date命令的基本语法.这是一个简单的脚本:

#!/bin/bash 
set -x 
DATE_COMMAND="date "+%y-%m-%d %H:%M:%S"" 
echo "$($DATE_COMMAND)" 
set +x
Run Code Online (Sandbox Code Playgroud)

问题是上面的代码不起作用.这是输出:

+ DATE_COMMAND='date +%y-%m-%d'
+ %H:%M:%S
onlyDate: line 3: fg: no job control
+ echo ''

+ set +x
Run Code Online (Sandbox Code Playgroud)

好吧,问题是bash因为空间而拆分命令.我能理解,但我不知道如何避免这种情况.我试图避开空间\,以避免空间和".单引号似乎也不起作用.

请注意,我知道这个脚本可以这样写:

#!/bin/bash
set -x
DATE_COMMAND=$(date "+%y-%m-%d %H:%M:%S")

echo "$DATE_COMMAND"
set +x
Run Code Online (Sandbox Code Playgroud)

我试过了,但我不能使用这种方法,因为我想在我的脚本中多次运行该命令.

任何帮助将非常感谢!

5go*_*der 10

正确的方法是在Bash脚本中定义自己的函数.

function my_date {
  date "+%y-%m-%d %H:%M:%S"
}
Run Code Online (Sandbox Code Playgroud)

现在你可以my_date像使用外部程序一样使用它.

例如:

echo "It is now $(my_date)."
Run Code Online (Sandbox Code Playgroud)

或者干脆:

my_date
Run Code Online (Sandbox Code Playgroud)

为什么你的方法不起作用?

第一个问题是你的任务被打破了.

DATE_COMMAND="date "+%y-%m-%d %H:%M:%S""
Run Code Online (Sandbox Code Playgroud)

这被解析为字符串date +%y-%m-%d到变量的赋值DATE_COMMAND.在空白之后,shell开始以您不想要的方式解释剩余的符号.

这可以通过更改报价来部分修复.

DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"
Run Code Online (Sandbox Code Playgroud)

但是,这并没有真正解决问题,因为如果我们现在使用

echo $($DATE_COMMAND)
Run Code Online (Sandbox Code Playgroud)

它不会正确扩展论证.该date程序将看到的参数'+%y-%m-%d%H:%M:%S'(带引号),而不是一个字符串.这可以通过使用eval如下来解决

DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"
echo $(eval $DATE_COMMAND)
Run Code Online (Sandbox Code Playgroud)

其中变量DATE_COMMAND首先被扩展为字符串date '+%y-%m-%d %H:%M:%S',然后eval就像它被编写一样,从而date正确调用.

请注意,我只是为了解释这个问题而展示这个. eval这里不是一个好的解决方案.请改用功能.

PS最好避免使用全大写标识符字符串,因为它们通常与环境变量冲突,甚至对shell具有神奇的意义.


小智 5

逃脱空间对我有用。

echo `date +%d.%m.%Y\ %R.%S.%3N` 
Run Code Online (Sandbox Code Playgroud)