![Bashスクリプトで「cp」を使用する[閉じる]](https://linux33.com/image/14124/Bash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%80%8Ccp%E3%80%8D%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%5B%E9%96%89%E3%81%98%E3%82%8B%5D.png)
このスクリプトが機能しないのはなぜですか?常にスクリプトを含むデフォルトディレクトリを開きます。新しいディレクトリを開くことはできません。
#!/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
ファイルを開くことができます。foo
bar
したがって、ここでリダイレクトは空のファイルを提供しますmkdir
が、コマンドの残りの部分は拡張項目(変数の内容と固定文字列が一緒に関連付けられている)に名前付きcp $list $map+copy
ファイルをコピーします。$list
$map+copy
$map
+copy
一方、それを開いて印刷することができ、cat foo
その印刷物をというファイルに送信できます。実際には、これを行うのとほぼ同じです。ただし、その項目に「いいね」を表示し、所有者と権限情報をコピーできるという点だけが異なります。 。foo
cat foo > bar
bar
cp foo bar
cp
-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
と$item
isの場合、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
望むより: