変数内に格納された文字列に対してコマンドを実行することは可能ですか?

変数内に格納された文字列に対してコマンドを実行することは可能ですか?

こんにちは。現在、次のコードを実行しようとしています。変数 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これは、シェル パターン に一致する最長の接尾辞文字列を から削除します/*。文字列が の場合2021/10/21、 を返します2021

ディレクトリ内のすべてのファイルの最初の4文字を取得するには(これが私が信じる現在のコードが実行しようとしている操作を実行するには、次のようにしますsed

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

これは各ファイルの最初の行を読み取り、その行の内容をその行の最初の 4 文字に置き換え、結果を端末に出力してから終了します。

答え2

シェルがサポートしている場合は、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

古き良きものを使ったもう一つのawk

for file in *; do
    awk -F'-' 'NR==1 {print $1}' $file
done
  • -F '-'awkに-区切り文字としてを使用するように指示します
  • NR==1awkに各ファイルの最初の行だけを読み込むように指示する
  • {print $1}区切り文字で区切られた最初のフィールドのみを印刷します

関連情報