为什么这个脚本不起作用?它始终打开脚本所在的默认目录,无法打开新目录
#!/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
复制所有者和权限信息。
而且,在 shell 中,您可以通过将字符串彼此相邻(中间没有任何空格)来连接字符串。因此,如果您设置变量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
containsfoobar
和$item
is hello.txt
,这将创建一个目录foobarcopy
,并复制hello.txt
到该目录:
mkdir -p "${map}copy"
cp "$item" "${map}copy"
(-p
告诉mkdir
如果目录已经存在则不要出错。)
看:
对于问题。 (不是)双引号变量。
另外,代替:
list=$( ls )
for item in $list; do
您可以让 shell 生成文件名列表,而无需调用ls
:
for item in ./*; do
看: