我的使用功能是否正确实现?

我的使用功能是否正确实现?

我有几个用作命令的函数~/.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

  1. 使用变量时用双引号引起来。否则,如果您传递包含空格的值,它们就会中断。此外,不需要该子 shell。所以if (usageSliceArr $1 $2 $3); then你应该写if usageSliceArr "$1" "$2" "$3"; then
  2. 用于-ne比较数字,!=对于字符串
  3. 别忘了还有https://shellcheck.net/
  4. 使用变量时用双引号引起来
  5. 将使用消息放在执行工作的函数内,以便代码成为自文档化的
  6. 将错误消息写入标准错误而不是标准输出
  7. 考虑将命令编写为驻留在您的 shell 脚本中,$PATH而不是仅在您~/.bash_profile执行时才可用的函数
  8. 我是否提到过在使用变量时应该用双引号引起来?

以下是一种方法:

########################################################################
# 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它不仅仅是一次性脚本。

相关内容