我正在尝试在Bash中创建一个reverse
函数,它将使用main
函数和reverse
函数将目录或项目数组作为参数反转。我相信我的main
函数搞砸了,或者我无法调用我创建的reverse
函数。我也不熟悉Bash。
#!/bin/bash
function reverse(){
input=$1 #1st parameter
copy=${input}
len=${#copy}
for((i=$len-1;i>=0;i--)); do
if [ $i = "[" ]; then
continue
fi
rev="$rev${copy:$i:1}"
done
echo "var: $var, rev: $rev"
}
function main(){
arr=( tiger lion bear )
mydir = $arr
reverse $mydir
echo $reverse
# should print: bear lion tiger
}
main
答案 0 :(得分:3)
您的代码存在两个大问题:
分配给mydir
时,您可能希望复制整个数组。但是您指定$arr
,这与仅指定第一个元素${arr[0]}
相同。引用Arrays section of man bash
:
引用不带下标的数组变量相当于使用下标0引用。
您应该使用mydir=( "${arr[@]}" )
到copy the array然后使用类似的构造将整个数组传递给reverse
函数。但是你根本不必复制数组,这个main
就足够了:
function main(){
arr=( tiger lion bear )
reverse "${arr[@]}"
}
reverse
的实现会在其第一个参数中反转字母,即arr
数组的第一项,因为它现在被称为。你应该反转数组。它将存储在函数the @
variable的参数中。您可以通过params
将您的函数的所有参数作为params=( "$@" )
数组获取。
第二点强烈暗示我你不知道你在做什么,而你只是从某个地方复制粘贴的部分脚本。我不会为你编写代码。如果您了解Bash的基础知识,那么这很容易做到。如果你不这样做,去学习它们。您将不会通过从Stack Overflow或其他站点复制粘贴ad-hoc片段来学习任何内容。下次,你会再次问几乎同样的问题。我们不是为您做功课,我们来teach you。
还有一些小问题,但在功能方面仍然非常严重。
shell中的变量赋值中=
周围不能有空格。分配到main
时,您可以在mydir
中找到它们。这就是为什么Bash可能会输出错误,说明找不到任何名为mydir
的命令。每个shell将命令行拆分为单词,并将第一个单词视为命令名。
你的reverse
函数不必要地复制input
变量 - 当然,除非你真的想像现在一样在最后打印原始值。但是,我宁愿将内容复制到名为original
的变量并处理input
变量,因为这样的意图会更容易理解。
无论你在shell中扩展变量,你都应该在双引号中扩展它,除非你有充分的理由不这样做,你知道你在做什么。如果你在双引号之外扩展它,你将遇到逃避错误的麻烦。 Double quotes保护内部的大多数特殊字符不被shell解释,只允许变量,命令,算术和历史扩展。
在reverse
的循环中,i
应包含一个数字。测试字符串是否与[
相等是无稽之谈。这种情况总是错误的。
您永远不会初始化var
变量,但您会在echo
正文末尾的reverse
语句中使用其值。
在首次使用之前,您也没有指定rev
变量的值。由于默认情况下所有变量都为空,并且您只使用reverse
一次,这不是问题,但它仍然不是一个好习惯。
另一个没有初始化的变量是reverse
的最后一行main
。 shell中的函数调用仅返回状态,与任何其他命令非常相似。您可以修改函数内的(全局)变量,但不要这样做。 echo
末尾的main
命令无用。
即使你是一个shell初学者,我已经告诉你足够了解reverse
的正确实现。如果您再次阅读Arrays section of Bash manual,一切都应该清楚。如果不是,请发表评论,我会尽力给你更多指导。