这个简单的bash脚本不起作用。我究竟做错了什么?

时间:2016-08-25 16:00:11

标签: bash shell

我正在尝试创建一个只需cd ../n的脚本,其中n是我传递给它的内容,或默认情况下为1:< / p>

STEPS=${1:-1}
for i in $STEPS; do
    cd ..
done

它没有给我任何错误,它什么也没做。

3 个答案:

答案 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(您运行脚本的那个)将不受影响。