web-dev-qa-db-ja.com

bashスクリプトで「declare-f」と「declare-a」が必要なのはなぜですか?

とても無邪気な質問でごめんなさい-私はただ理解しようとします...

たとえば-私は持っています:

$ cat test.sh
#!/bin/bash
declare -f testfunct

testfunct () {
echo "I'm function"
}

testfunct

declare -a testarr

testarr=([1]=arr1 [2]=arr2 [3]=arr3)

echo ${testarr[@]}

そして、それを実行すると、次のようになります。

$ ./test.sh
I'm function
arr1 arr2 arr3

だからここに質問があります-私がしなければならないこと(もし必要なら...)のためにここにdeclareを挿入しますか?それがあってもなくても同じように機能します...

たとえば、declare -i varまたはdeclare -r varを理解できます。しかし、-f(関数を宣言する)と-a(配列を宣言する)とは何ですか?

ヒントとリンクをありがとう。

16
setevoy

declare -f functionnameは、関数functionnameが存在する場合はその定義を出力するために使用され、functionnameが関数である/関数になることを絶対にしないでください宣言。見てください:

$ unset -f a # unsetting the function a, if it existed
$ declare -f a
$ # nothing output and look at the exit code:
$ echo $?
1
$ # that was an "error" because the function didn't exist
$ a() { echo 'Hello, world!'; }
$ declare -f a
a () 
{ 
    echo 'Hello, world!'
}
$ # ok? and look at the exit code:
$ echo $?
0
$ # cool :)

したがって、あなたの場合、declare -f testfunctは、おそらくtestfunctが存在する場合を除いて、何もしません。その定義をstdoutに出力します。

14
gniourf_gniourf

私の知る限り、-aオプションだけでは実用的な関連性はありませんが、配列を宣言するときの読みやすさにはプラスだと思います。他のオプションと組み合わせて特別なタイプの配列を生成すると、さらに興味深いものになります。

例えば:

# Declare an array of integers
declare -ai int_array

int_array=(1 2 3)

# Setting a string as array value fails
int_array[0]="I am a string"

# Convert array values to lower case (or upper case with -u)
declare -al lowercase_array

lowercase_array[0]="I AM A STRING"
lowercase_array[1]="ANOTHER STRING"

echo "${lowercase_array[0]}"
echo "${lowercase_array[1]}"

# Make a read only array
declare -ar readonly_array=(42 "A String")

# Setting a new value fails
readonly_array[0]=23
6
eminor

declare -fを使用すると、定義されているすべての関数(またはソース)とその内容を一覧表示できます。

使用例:

[ ~]$ cat test.sh
#!/bin/bash

f(){
    echo "Hello world"
}

# print 0 if is defined (success)
# print 1 if isn't defined (failure)
isDefined(){
    declare -f "$1" >/dev/null && echo 0 || echo 1
}

isDefined f
isDefined g
[ ~]$ ./test.sh 
0
1
[ ~]$ declare -f
existFunction () 
{ 
    declare -f "$1" > /dev/null && echo 0 || echo 1
}
f () 
{ 
    echo "Hello world"
}

ただし、以下のgniourf_gniourfで賢く言ったように、関数の存在をテストするにはdeclare -Fを使用することをお勧めします。

5
Idriss Neumann