コマンドとして使用されるいくつかの機能があり、~/.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
- 変数を使用するときは二重引用符を使用してください。それ以外の場合は、スペースを含む値を渡すと中断されます。さらに、サブシェルも必要ありません。だから
if (usageSliceArr $1 $2 $3); then
あなたは書かなければなりません。if usageSliceArr "$1" "$2" "$3"; then
- 文字列の場合、
-ne
数値を比較するために使用されます。!=
- あることを忘れないでください。https://shellcheck.net/
- 変数を使用するときは二重引用符を使用してください。
- コードが自己文書化されるように操作を実行する関数の中に使用法メッセージを入れます。
- エラーメッセージの書き込み標準エラー代わりに標準出力
- コマンドの実行時にのみ使用できる
$PATH
のではなく、シェルスクリプト内の関数でコマンドを作成することを検討してください。~/.bash_profile
- 変数を使用するときは、変数を二重引用符で囲む必要があると述べましたか?
1つの方法は次のとおりです。
########################################################################
# 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' )
「Twenty-3」は単一要素として抽出されますが、スペースで区切られた2つの値「Twenty」と「Three」として返されます。