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

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

您好,我目前正在尝试执行以下代码。我在变量 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

谢谢

答案1

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

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

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

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

YYYY=${DATE%%/*}

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

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

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

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

答案2

如果您的 shell 支持,您可以使用 Here Strings ( <<<) 来实现此目的。从man bash

Here Strings
       A variant of here documents, the format is:

              [n]<<<word

       The word undergoes tilde expansion, parameter and variable  expansion,
       command  substitution, arithmetic expansion, and quote removal.  Path‐
       name expansion and word splitting are not performed.   The  result  is
       supplied  as  a single string, with a newline appended, to the command
       on its standard input (or file descriptor n if n is specified).

在你的情况下,你会这样做:

for file in ~/filesToSort/*
do

   date=$(head -1 "$file" | tr "-" "/")
   echo "${DATE}"
   yyy=$(cut -c1-4 <<< "$date")
   echo "$yyy"
done

答案3

使用好 ole 的另一种方法awk

for file in *; do
    awk -F'-' 'NR==1 {print $1}' $file
done
  • -F '-'告诉 awk 使用 the-作为分隔符
  • NR==1告诉 awk 仅读取每个文件的第一行
  • {print $1}只打印由分隔符分隔的第一个字段

相关内容