echoを使用して端末に値を表示せずに変数に値を割り当てる方法

echoを使用して端末に値を表示せずに変数に値を割り当てる方法

私のバッシュスクリプト

#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
    echo $i | sed 's/\(.*\)\..*/\1/'
    cp -v ~/Desktop/library/template.py "$i".py
done

を作成すると、このスクリプトはA B.py C D.py実行中の操作を説明するA.py B.py C.py D.py
-vフラグに変換します。cp -v

しかし、私は印刷したくない編集されたファイル名echo $i。とても迷惑です。

どうすればいいですか?
代替ソリューションも高く評価されます。

答え1

$i文字列の最後の点の後の値を切り取りたいです。

次のことができます。

i=${i%.*}

$iこれにより、ファイル名のワイルドカードパターンに一致する最も短いサフィックス文字列.*(ドットの後に文字列が続く)が削除されます。

具体的に整理したい場合.py

i=${i%.py}

cpこれは、次のようにコマンドを作成できることを意味します。

cp -v ~/Desktop/library/template.py "${i%.py}.py"

これはループ本文の唯一のコマンドです。値にそのようなサフィックスが含まれている場合は、ファイル名のサフィックスを.py削除して追加します。これにより、サフィックスの重複を避けながら、ターゲットファイル名に常にファイル名サフィックスが含まれていることが確認されます。$i.py.py


スクリプト提案:

#!/bin/sh

for string do
    cp -v ~/Desktop/library/template.py "${string%.py}.py"
done

または、

#!/bin/zsh

for string; cp -v ~/Desktop/library/template.py $string:r.py

...zshシェル、代替ショートループ形式、およびfor修飾子を使用して、ファイル拡張子を名前に追加する前に削除します:r.py

次のように、2つのスクリプトのいずれかを呼び出すことができます。

./script A B.py C D.py

答え2

私はトリックを見つけました:

#!/bin/bash
read -r -p "Enter the filenames: " -a arr
for i in "${arr[@]}"
do
    var=$(echo "$i" | sed 's/\(.*\)\..*/\1/')
    cp -v ~/Desktop/library/template.py "$var".py
done

関連情報