我的 bash 脚本
echo -n "Round Name:"
read round
mkdir $round
echo -n "File Names:"
read $1 $2 $3 $4 $5 $6
cp ~/Documents/Library/Template.py $1.py $2.py $3.py $4.py $5.py $6.py .
我对目录有自动化,并且希望对文件名有相同的自动化。
接受未知输入后,如何让我的 shell 脚本执行此操作?
cp ~/Documents/Library/Template.py A.py B.py C.py D1.py D2.py $round/.
答案1
只需让用户在脚本的命令行上传递它们,而不是以交互方式读取各种字符串。
下面的脚本将被称为
./script -d dirname -t templatefile -- string1 string2 string3 string4
dirname
...如果它尚不存在,它将创建,然后templatefile
使用字符串给出的根名称复制到该目录中。如果模板文件具有文件名后缀,则会将其添加到每个字符串的末尾以创建新文件名(从字符串中删除后缀以免重复现有后缀之后)。
您可以使用 选项绕过脚本中创建目录的步骤-n
,这使得脚本假定 指定的目录-d
已存在。
#!/bin/sh
# Unset strings set via options.
unset -v dirpath do_mkdir templatepath
# Do command line parsing for -d and -t options.
while getopts d:nt: opt; do
case $opt in
d)
dirpath=$OPTARG
;;
n)
do_mkdir=false
;;
t)
templatepath=$OPTARG
;;
*)
echo 'Error in command line parsing' >&2
exit 1
esac
done
shift "$((OPTIND - 1))"
# Sanity checks.
: "${dirpath:?Missing directory path (-d)}"
: "${templatepath:?Missing template file path (-t)}"
if [ ! -f "$templatepath" ]; then
printf 'Can not find template file "%s"\n' "$templatepath" >&2
exit 1
fi
if "${do_mkdir-true}"; then
# Create destination directory.
mkdir -p -- "$dirpath" || exit
fi
if [ ! -d "$dirpath" ]; then
printf 'Directory "%s" does not exist\n' "$dirpath" >&2
exit 1
fi
# Check to see whether the template file has a filename suffix.
# If so, save the suffix in $suffix.
suffix=${templatepath##*.}
if [ "$suffix" = "$templatepath" ]; then
# No filename suffix.
suffix=''
else
# Has filename suffix.
suffix=.$suffix
fi
# Do copying.
for string do
# Remove the suffix from the string,
# if the string ends with the suffix.
string=${string%$suffix}
cp -- "$templatepath" "$dirpath/$string$suffix"
done
要在问题末尾重新创建示例,您可以像这样使用此脚本:
./script -t ~/Documents/Library/Template.py -d "$round" -- A B C D1 D2
答案2
#!/bin/bash
echo -n "Round Name:"
read round
mkdir $round
read -r -p "Enter the filenames:" -a arr
for filenames in "${arr[@]}"; do
cp ~/Documents/Library/Template.py $round/$filenames
done
这是通过数组完成的,因此它接受无限输入。只需输入以空格分隔的文件名,如下所示:
Enter the filenames:test1 test2 test3