Bashスクリプトで「cp」を使用する[閉じる]

Bashスクリプトで「cp」を使用する[閉じる]

このスクリプトが機能しないのはなぜですか?常にスクリプトを含むデフォルトディレクトリを開きます。新しいディレクトリを開くことはできません。

#!/bin/bash

read -p "choose a directory: " map
list=$( ls )
for item in $list; do
    echo $item
    read -p "Make copy? " ans

    if [ $ans = "yes" ]; then        
        cp $item > mkdir $map+copy
    fi
done
echo "Done"

答え1

cp $item > mkdir $map+copy

>良いです。コマンドの出力、つまり印刷される部分を(通常端末に)リダイレクトします。たとえば、lsファイルリストが出力されるため、ls > list.txtリストが出力されますlist.txt。ただし、たとえば、端末に何も出力せずに明示的にcp foo barファイルを開くことができます。foobar

したがって、ここでリダイレクトは空のファイルを提供しますmkdirが、コマンドの残りの部分は拡張項目(変数の内容と固定文字列が一緒に関連付けられている)に名前付きcp $list $map+copyファイルをコピーします。$list$map+copy$map+copy

一方、それを開いて印刷することができ、cat fooその印刷物をというファイルに送信できます。実際には、これを行うのとほぼ同じです。ただし、その項目に「いいね」を表示し、所有者と権限情報をコピーできるという点だけが異なります。 。foocat foo > barbarcp foo barcp-a-p

また、シェルでは、スペースを空けずに文字列を並べて配置することで、文字列を連結できます。したがって、変数を設定すると、x=foo y=barこれらすべてが印刷されますfoobar

echo foobar
echo "foo""bar"
echo "$x$y"
echo "foo$y"
echo "${x}bar"

これは"${map}copy"、2つの部分を"$map""copy"接続できることを意味します。

mkdirしかし、別々に実行する必要があるのでcp$mapインクルードfoobar$itemisの場合、hello.txtディレクトリが作成され、ここにfoobarcopyコピーされます。hello.txt

mkdir -p "${map}copy"
cp "$item" "${map}copy"

(ディレクトリがすでに存在する場合はエラーが発生しないように-p指示しますmkdir。)

望むより:

質問について。 (いいえ)二重引用符で囲まれた変数。


また、次の代わりに:

list=$( ls )
for item in $list; do

以下を呼び出すことなく、シェルにファイル名のリストを生成させることができますls

for item in ./*; do

望むより:

関連情報