我有几个用作命令的函数~/.bash_profile
,并且我还为它们创建了使用函数。
我想知道我自己开发的使用功能是否正确实现。
例子
IFS=$'\n'
usageSliceArr() {
if [ $# != 3 ]; then
echo 'name, index 1, index 2'
return 1
fi
}
slicearr() {
if (usageSliceArr $1 $2 $3); then
declare -n name=$1
declare -i fst=$2 lst=$3
echo ${name[@]:fst:lst}
fi
}
答案1
- 使用变量时用双引号引起来。否则,如果您传递包含空格的值,它们就会中断。此外,不需要该子 shell。所以
if (usageSliceArr $1 $2 $3); then
你应该写if usageSliceArr "$1" "$2" "$3"; then
- 用于
-ne
比较数字,!=
对于字符串 - 别忘了还有https://shellcheck.net/
- 使用变量时用双引号引起来
- 将使用消息放在执行工作的函数内,以便代码成为自文档化的
- 将错误消息写入标准错误而不是标准输出
- 考虑将命令编写为驻留在您的 shell 脚本中,
$PATH
而不是仅在您~/.bash_profile
执行时才可用的函数 - 我是否提到过在使用变量时应该用双引号引起来?
以下是一种方法:
########################################################################
# slicearr name index count
#
# Return <count> space-separated and tokenised elements from the <name>
# array starting at <index>
#
slicearr() {
if [ $# -ne 3 ]
then
echo 'Usage: name index count' >&2
exit 1
fi
declare -n name=$1
printf "%s " "${name[@]:$2:$3}"; echo
}
的相关性空格分隔和标记化子句也适用于您的原始代码。考虑一个数组
a=( one two 'twenty three' )
“二十三”将作为单个元素提取,但作为两个空格分隔的值“二十”和“三”返回。
答案2
使用 @StéphaneChezalas 的一些好的建议,我现在要这样做:
IFS=$'\n'
usageSliceArr() {
if (( $# != 3 )); then
echo 'name, index 1, index 2'
return 1
fi
}
slicearr() {
usageSliceArr $@ &&
declare -n name=$1
declare -i fst=$2 lst=$3
echo ${name[@]:fst:lst}
}
请记住,我有很多功能,包括我的这个功能,~/.bash_profile
它不仅仅是一次性脚本。