【菜鸟笔记】Ubuntu系统shellscript中 关于for循环以及declare出错的原因

本文探讨了bash与sh(dash)脚本语言之间的兼容性问题,特别是for循环的不同实现导致的错误。通过分析Ubuntu系统中sh的实际指向,提供了解决方案,包括直接使用bash或更改系统的默认shell。

问题描述:

for的各种句式语法中,for((i=0;i<10;i++))这一句式,在bash中能够顺利得到执行

如果用sh执行 *.sh,for的这一句式是无法执行的,会报错“Syntax error: Bad for loop variable”。

后来在网上找原因的时候,发现有网友反应脚本中如果使用declare也会出现类似情况,

即在sh中执行就报错“delcare: not found”,在bash中就可以正常执行。


知其所以然:

键入which sh,找到Ubuntu的sh位于/bin/sh,然后 ls -l /bin/sh ,发现/bin/sh其实是一个硬链接,指向了dash。

而dash虽然体积小速度快,兼容性好,但是相应的,在bash中能够顺利执行的一些东西在dash中就不支持了。


解决办法:

简单只是练习或偶尔执行脚本的话,使用bash 执行 *.sh就是了;

如果想彻底解决,就使用度娘给的办法:键入sudo dpkg-reconfigure dash,并选择否。即强制ubuntu不使用dash作为系统默认的shell。

然后再次ls -l /bin/sh,就会看到“/bin/sh -> bash”了。解决!

### Shell 脚本中的 For 循环语法与用法 在 Shell 脚本中,`for` 循环是一种常用的方式来遍历一组值或执行重复任务。以下是 `for` 循环的基本语法和使用方法: #### 基本语法 ```bash for variable in list do command1 command2 ... done ``` 在这个结构中,`list` 是一系列需要遍历的值,`variable` 是每次迭代时存储当前值的变量[^1]。 #### 示例:遍历数组 以下是一个示例脚本,展示如何使用 `for` 循环打印数组的内容: ```bash #!/bin/bash declare -a names=(Foo Bar Tom Jerry) # 定义一个数组 echo "Content of names array is:" for name in "${names[@]}" do echo -n "$name " # 打印每个元素,并在同一行显示 done echo # 换行 ``` 上述代码通过 `for` 循环逐一访问数组 `names` 中的每个元素,并将其打印出来[^1]。 #### 使用范围生成器 Shell 还支持使用范围生成器来简化循环定义。例如: ```bash for i in {1..5} do echo "Number: $i" done ``` 此代码将打印数字 1 到 5[^3]。 #### 遍历文件或目录 `for` 循环也可以用于遍历文件或目录。例如: ```bash for file in *.txt do echo "Processing file: $file" done ``` 这将遍历当前目录下所有以 `.txt` 结尾的文件[^2]。 #### 复杂表达式 在更复杂的场景中,可以结合 `expr` 或算术扩展来控制循环。例如: ```bash for ((i=0; i<5; i++)) do echo "Iteration: $i" done ``` 这段代码展示了 C 风格的 `for` 循环语法,其中初始化、条件判断和增量操作被明确指定[^3]。 #### 变量引用的最佳实践 当引用变量时,建议使用完整的语法 `${variable}` 来避免歧义。例如: ```bash somescript /tmp/rep${SUM}bay.txt ``` 这种写法确保了变量名不会与其他文本混淆[^4]。 ### 注意事项 - 确保脚本的第一行为正确的 shebang(如 `#!/bin/bash`),以便正确解释脚本语言[^2]。 - 在处理复杂逻辑时,合理使用括号和引号以防止意外的空格或字符问题。 ```bash #!/bin/bash declare -a fruits=("Apple" "Banana" "Cherry") echo "List of fruits:" for fruit in "${fruits[@]}" do echo "Fruit: $fruit" done ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值