我正在尝试我的第一个 bash 脚本。我想提示用户找出他们想要保存克隆存储库的位置。
目前我正在这样分配它。
warpToLocation="${HOME}/apps/"
有没有办法做到这样:
read -e -p "Enter the path to the file: " -i "${HOME}/apps/" FILEPATH
但将结果另存为warpToLocation
?
编辑:
#!/bin/bash
echo "where would you like to install your repos?"
read -p "Enter the path to the file: " temp
warpToLocation="${HOME}/$temp/"
warpInLocations=("[email protected]:cca/toolkit.git" "[email protected]:cca/sms.git" "[email protected]:cca/boogle.git" "[email protected]:cca/cairo.git")
echo "warping in toolkit, sms, boogle and cairo"
for repo in "${warpInLocations[@]}"
do
warpInDir=$repo
warpInDir=${warpInDir#*/}
warpInDir=${warpInDir%.*}
if [ -d "$warpToLocation"]; then
echo "somethings in the way.. $warpInDir all ready exists"
else
git clone $repo $warpInDir
fi
done
我为得到该错误所做的就是添加您给我的代码。
问题是-e
(它允许您用箭头编辑输入)和-i
(预览/可选答案)在 bash 版本 4 及更高版本上运行,而我正在运行 version GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
。
答案1
出了什么问题
read -e -p "Enter the path to the file: " -i "${HOME}/apps/" warpToLocation
?
答案2
以交互方式询问用户路径名很少有建设性。这将脚本的可用性限制为交互式使用,并强制用户(正确地)输入可能很长的路径名,而无法使用像$HOME
or $project_dir
(或用户喜欢使用的任何变量)这样的变量名,并且无法使用~
.
相反,从命令行获取目标目录的路径名,验证它是否是一个目录,然后将 Git 存储库克隆到其中(如果它们尚不存在)。
#!/bin/sh
destdir=$1
if [ ! -d "$destdir" ]; then
printf 'No such directory: %s\n' "$destdir" >&2
exit 1
fi
for repo in toolkit sms boggle cairo
do
if [ -e "$destdir/$repo" ]; then
printf 'Name %s already exists for repository %s (skipping)\n' \
"$destdir/$repo" "$repo" >&2
continue
fi
printf 'Cloning %s\n' "$repo"
git clone "[email protected]:cca/$repo.git" "$destdir/$repo"
done
该脚本将用作
./script.sh "$HOME/projects/stuff"
并且无需用户交互即可运行,例如 Ansible 或 Cron。