是否可以对存储在变量内的字符串执行命令?

cal*_*223 0 scripting shell-script

您好,我目前正在尝试执行以下代码。我在变量 DATE 中存储了一个字符串,其格式为 YYYY/MM/DD。我尝试使用 cut 命令提取年份。我收到一条错误消息,指出它不是文件或目录。我可以进行修改或采取不同的方法吗?

for file in ~/filesToSort/*
do

   DATE=$(head -1 $file | tr "-" "/")
   echo "${DATE}"
   YYYY=$(cut -c1-4 accounts $DATE)
   #echo "${YYYY}"
done
Run Code Online (Sandbox Code Playgroud)

谢谢

Kus*_*nda 6

cut实用程序从其标准输入流读取数据,它不会对作为参数给出的字符串进行操作。

因此,要使用cut,您需要在标准输入上传递数据:

YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )
Run Code Online (Sandbox Code Playgroud)

然而,这在循环中会非常慢。相反,使用内置参数替换来删除字符串/中第一个之后的所有内容$DATE

YYYY=${DATE%%/*}
Run Code Online (Sandbox Code Playgroud)

$DATE这会删除与shell 模式匹配的最长后缀字符串/*。如果字符串是2021/10/21,则返回2021

要获取目录中每个文件的前四个字符(这是我相信您当前代码尝试执行的操作的本质),您可以sed像这样使用:

for name in "$HOME"/filesToSort/*; do
    sed -e 's/\(....\).*/\1/' -e q "$name"
done
Run Code Online (Sandbox Code Playgroud)

这会读取每个文件的第一行,用该行的前四个字符替换该行的内容,然后将结果输出到终端后退出。