編集する

編集する

Ubuntuでいくつかのスクリプトを作成しました。 KaliとDebianでそれを使用すると、フォーマットされたevalテキストファイルからデータを抽出するために使用したコマンドが正しく機能しないことがわかりました。 Debian ベースのシステムで動作させる方法を知っている人はいますか?

どうやって使うの?eval(小さい例)

#!/bin/bash
basename=$(basename $0)
dirname=$(dirname $0)
if [[ $EUID -gt 0 ]];
then
    exec sudo "$dirname/$basename" "$@"
fi
myscript=$dirname/$basename
function getlistof () {
    awk "/^#BEGIN-$1#/, /^#END-$1#/" $myscript | grep -v '#BEGIN\|#END' | grep "$2"
}
getlistof log mylink | while read mylink # here mylink='mylink=(source=... destn=....) (var)'
    do
        eval "$mylink" # and here should become mylink='(source=... destn=....)(array)'
        eval "${mylink[*]}" # and here the script should know about vars inside the array!
        echo " $source $destn"
    done
exit
#BEGIN-log#
mylink=(source=sources_one destn=destn_one)
mylink=(source=source_two destn=destn_two)
#END-log#

これはUbuntuからのこのスクリプトの出力です。

 younes@unix:~$ ./myscript
 sources_one destn_one
 source_two destn_two

情報

問題を単純化しようとしたとき、私は問題を解決していました。カリ Linuxchroot環境を通して!

younes@unix:~$ lsb_release -srci
Ubuntu
15.04
vivid
younes@unix:~$ ./myscript
 sources_one destn_one
 source_two destn_two
younes@unix:~$ sudo cp -f myscript /.Kali-2.0-sana/home/younes/
younes@unix:~$ chroothere /.Kali-2.0-sana
root@unix:/# lsb_release -srci
Kali
2.0
sana
root@unix:/# /home/younes/myscript 
 sources_one destn_one
 source_two destn_two
root@unix:/# 

このように助けてくれた編集者に感謝し、ここに書いてくれたすべての内容に感謝します!

ベストアンサー1

編集する

ユーザーは自分の質問を広範囲に変更し、この回答はユーザーが投稿したコードを編集したもので、これ以上質問には含まれなくなりました。

新しいコードがあり、質問が別のものに変更されました。

したがって、この回答は古い(そして無効な)コードと見なされるべきです。

オリジナル

あなたのコードを正しく理解したら。
コードから2つの変数の値を取得するにはevalを使用します。
これは「悪い習慣」と見なされます。

ソースファイルを次のように変更する場合:

LINK=(SRC=/.hd/home/younes/.conky DST=/home/younes/.conky)

到着

/.hd/home/younes/.conky /home/younes/.conky

または、このドキュメントに一対の値を挿入しても、このコードはevalなしで同じことを行います。

while read SRC DST
do
    [[ ! -e $SRC ]] && [[ ! -e $DST ]] && echo "oOpsS! $DST" && exit
    [[ ! -e $SRC ]] &&  mv "$DST" "$SRC"
    [[ ! -e $DST ]] &&  $LINKIT "$SRC" "$DST"
    ls -l "$DST" | grep "$SRC" &>/dev/null || $LINKIT "$SRC" "$DST"
done <<\_list_of_dir_pairs_
/.hd/home/younes/.conky             /home/younes/.conky
/.hd/home/younes/.fonts             /home/younes/.fonts
/.hd/home/younes/.thumbnails        /home/younes/.thumbnails
/.hd/home/younes/.xbindkeys         /home/younes/.xbindkeys
/.hd/home/younes/.xbindkeys_config  /home/younes/.xbindkeys_config
/.hd/home/younes/.xbindkeysrc       /home/younes/.xbindkeysrc
_list_of_dir_pairs_

配列LINKが本当に必要な場合は、次のようにします。

LINK=($SCR $DST)

私はmvとLINKITのSRCとDSTのvar拡張を参照し、LINKITを$ LINKITに変更しました(これは関数ではなく変数であると仮定します。必要に応じて再度変更します)。

おすすめ記事