作業中のzshシェルスクリプトのいくつかのデフォルト変数を保存したいと思います。source
私のスクリプトで1行を使用することはうまくいくことを知っていますが、最も安全な方法ではありません。
すべてのユーザーの最大の互換性を確保するために、zsh(具体的にはAmazon Linux 2)でネイティブに提供されているツールを使用してテキストファイルから行を安全に読み取り、設定ファイルから事前設定された変数セットを抽出する方法はありますか?
テキストファイル自体はハッシュされないことを知っていますが、それは私の問題ではありません。私の目標は、誰かが設定ファイルにマルウェアを挿入し、それをスクリプトとして扱う可能性を避けることです。
答え1
zshが提供する文字列操作機能に加えて、それを容易にするzshのどの機能も考えられません。パラメータ拡張。
config
以下は、次の制約を使用してKEY = VALUE行を連想配列に解析するいくつかのコードです。
- キーにはASCII文字、数字、下線のみを含めることができます。キーは数字で始まるか空にすることはできません。
- 値には、改行およびヌルバイトを除くすべてのバイト文字列を含めることができます。これには、UTF-8などのマルチバイトエンコーディングに誤ったシーケンスが含まれる可能性があります。
- 空の行(ASCII水平スペースのみを含む行)とコメント行(スペースとaで始まる行
#
)は無視されます。 - いかなる種類の拡張もありません。変数の置換もなく、引用もなく、空白の削除もありません。
function parse_config {
emulate -LR zsh
setopt extended_glob
local n=0 line lines
local LC_ALL=C
lines=("${(@f)$(<$1)}")
for line in "${(@)lines}"; do
((++n))
line=${line##[$' \t']##}
if [[ -z $line || $line == \#* ]]; then
continue
elif [[ $line = *$'\0'* ]]; then
echo >&2 "$1:$n:Null character in configuration file"
config=()
return 1
elif [[ $line == [A-Z_a-z][0-9A-Z_a-z]#\=* ]]; then
config[${line%%=*}]=${line#*=}
else
echo >&2 "$1:$n:Syntax error in configuration file"
config=()
return 1
fi
done
}
次の関数を呼び出します。
set -e
typeset -A config
parse_config /path/to/config/file
echo "Configuration dump:"
for k in ${(ko)config}; do
print -lr "$k=$config[$k]"
done