이 스크립트가 작동하지 않는 이유는 무엇입니까? 항상 스크립트가 있는 기본 디렉터리를 엽니다. 새 디렉터리를 열 수는 없습니다.
#!/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"
두 부분을 "$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
바라보다: