我有几个目录需要更新,步骤相同,但显然每个目录的名称都不同。
我是编写脚本的新手。我可以用 eg 创建一个数组$array=('cd dir1', 'cd dir2');
并创建一个for
遍历每个目录的循环吗?
例子 (**我将使用 php 语法**):
$arr=array('cd dir1','cd dir2', 'cd dir3', 'cd dir4', 'cd dir5')
for($i=0; $<=5; $i++){
$arr[$i]
#MAKE STUFF
#MAKE MORE STUFF
cd ..
}
答案1
我建议不要存储命令在数组中,但只有参数(感谢@steeldriver 提供 bash 中的数组语法):
#!/usr/bin/env bash
dirs=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for dir in "${dirs[@]}"; do
cd "$dir"
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
注意:(cd -
减)更改回以前的目录(而不是父目录),因此它比 更安全cd ..
。
如果你真的想存储命令,那么您需要将数组元素作为命令来执行,只需将它们写下来即可:
#!/usr/bin/env bash
cmds=('cd dir1' 'cd dir2' 'cd dir3' 'cd dir4' 'cd dir5')
for cmd in "${cmds[@]}"; do
$cmd
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
请注意,现在脚本中存在不对称:最后一个cd -
假设$cmd
实际上是一个cd
命令。我不建议这样做。要么将两个命令都放在数组中,要么都不放。
答案2
我认为你需要这样做:
#!/usr/bin/env bash
# declare an array called array and define values
array=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for i in "${array[@]}"
do
cd "$i" || exit
#MAKE STUFF
#MAKE MORE STUFF
cd ..
done
答案3
关于 Bash 中的数组,已经有人问过(并回答过)类似的问题:(https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash)。
为了在 Bash 中创建字符串数组,你需要宣布使用 -a 参数的关键字(-a 表示数组):
# Array: list of strings (directories)
declare -a directories=("/bin" "/etc" "/usr")
# For each element in the array
for element in "${directories[@]}"
do
cd $element
## DO STUFF
done