我正在尝试创建一个只需cd ../
次n
的脚本,其中n
是我传递给它的内容,或默认情况下为1
:< / p>
STEPS=${1:-1}
for i in $STEPS; do
cd ..
done
它没有给我任何错误,它什么也没做。
答案 0 :(得分:3)
你应该能够找到它来做你想做的事,例如
. yourscript.sh 3
更改目录3次。 (注意yourscript.sh
之前的点)
至少修改脚本后,例如
#!/bin/bash
STEPS=$1
for ((i=1; i<=$STEPS; i++)); do
cd ..
done
感谢@Charles Duffy提及采购,并感谢@chepner提供固定for循环。
一些信息:
Shell脚本在子shell中运行,每个子shell都有自己的子shell 当前目录的概念。 cd成功了,但是很快 当子shell退出时,你将回到交互式shell中 那里什么都没改变。
来自here
答案 1 :(得分:1)
在bash
中,您通常不想生成一系列数字来迭代。使用C风格的for
循环:
for ((i=1; i<=$STEPS; i++)); do
cd ..
done
如果这是在文件中,您需要提取它(. ./cd-up
)而不是执行它(sh ./cd-up
或./cd-up
等)。
如果您实际上正在使用zsh
,则只需使用repeat
构造:
repeat $STEPS do cd ..; done
或简单命令的简短形式
repeat $STEPS cd ..
答案 2 :(得分:0)
假设$STEPS
始终是单个数字,那么for
循环将只运行一次迭代。这是因为您正在使用的循环类型需要一个单词列表:
for name in word1 word2 word3; do
# some stuff
done
这将运行三次,将列表中的每个值分配给变量$name
。
使用C风格的循环,您可以这样做:
steps=${1:-1}
for (( i = 0; i < steps; ++i )); do
cd ..
done
或者,在任何POSIX shell中,您都可以使用while
循环:
steps=${1:-1}
while [ $steps -gt 0 ]; do
cd ..
steps=$(( steps - 1 ))
done
如果你传递的东西不是整数,那么这些方法都不会起作用!
请记住,如果您将其作为脚本运行,它将在脚本运行时更改目录,但父shell(您运行脚本的那个)将不受影响。