Es ist gut zu wissen, dass es Probleme mit eval
( dies und das ) und echo
( hier ) gibt. Sie sollten es vermeiden eval
, es ist leicht zu missbrauchen.
Auch wenn diese Befehle in Ihren speziellen Fällen hier absolut sicher sind, empfehle ich Ihnen, diese aufzugeben eval
. Ihr Code ist dadurch tatsächlich zu kompliziert.
Ihr erstes Beispiel wird mit Arrays viel sauberer. Dies funktioniert in GNU bash 4.4.12 in meinem Debian:
# preparing variables unset -v list s s1 s2 declare -a list=( foo 'X Y' bar baz ) declare -a s declare -A s1=( [foo]='FOO 1' [bar]='BAR 2' [baz]='BAZ beep; eject /dev/sr0' ) declare -A s2=( [foo]='oof oof' [bar]='rab rab' [baz]='zab zab' [X Y]='9') # your code rewritten, we don't even need a counter for j in "$" do s+=( "$" "$" ) done # checking contents of s printf '%s\n' "$"
Hinweis: Suchen Sie nach "indizierten Arrays", "assoziativen Arrays" und deren Verwendung in bash
.
Beachten Sie, dass das Element mit Leerzeichen ( X Y
) für mich nichts Besonderes ist. aber es würde Ihren Code brechen. Ich kann auch BAZ beep; eject /dev/sr0
in meinem haben s1
; Ich wage Sie zu setzen s1baz='BAZ beep; eject /dev/sr0'
, baz
in Ihrem list
Array haben, Ihren Code ausführen und sehen, was passiert. Das ist, wozu eval
fähig ist. Stellen Sie sich jetzt vor, ich stelle rm -rf ~/
statt eject …
.
Das zweite Beispiel kann stark vereinfacht werden als:
sed -i "17i$sed17line" "$file"
Sie scheinen eine Vorliebe für eval
+ zu haben, echo
da Sie eine Vorrichtung geschaffen haben, die sie zweimal verwendet, wenn keine benötigt wird. Vielleicht liegt es daran, dass Ihre Variablen nicht immer auf ihre Werte erweitert werden, wenn Sie dies wünschen. Wenn ja, untersuchen Sie den Unterschied zwischen einfachen ( '
) und doppelten Anführungszeichen ( "
) in bash
.
Ein großes Lob dafür, Zweifel zu haben und die Frage zu stellen.