単一の文字列にエコーするときに空の変数名と値を削除する

単一の文字列にエコーするときに空の変数名と値を削除する

次の値を持つ次の条件があります。

emp_name="Sid"
emp_id=1234
emp_hobby=""
emp_likes="swimming"
emp_dislikes=""

emp_summary="emp_name:$emp_name,emp_id:$emp_id,emp_hobby:$emp_hobby,emp_likes:$emp_likes,emp_dislikes:$emp_dislikes"

たとえば、上記の値をエコーすると、結果が表示されます。

"emp_name:"Sid",emp_id:1234,emp_hobby:,empf_likes:"swimming",emp_dislikes:"

動的コードの助けが必要です。値が空の場合、以下のように変数全体がエコーから削除されます。

"emp_name:"Sid",emp_id:1234,emp_likes:"swimming"

{parameter:+word} 戻り値を試しましたが、変数名自体をどうすればよいかわかりません。

ベストアンサー1

拡張機能を使用${parameter:+word}し、静的部分(変数名)も右側に配置できます。

$ emp_name=""; echo "-${emp_name:+emp_name:$emp_name}-"
--
$ emp_name="foo bar"; echo "-${emp_name:+emp_name:$emp_name}-"
-emp_name:foo bar-

質問に表示する方法には、カンマという追加の問題があります。を使用できますが、"${emp_name:+emp_name:$emp_name}"すべての変数に対してこれを行うと、行末にカンマが表示されます。${str%,}文字列を変数に最初に保存すると、削除できます。str

ただし、すべての変数に対してこれを行うのは少し繰り返しです。 Bashを使用している場合は、namerefsを使用して変数をポイントし、テキストを文字列変数として収集できます。

str=()
for varname in emp_name emp_id emp_hobby emp_likes emp_dislikes; do
    declare -n var=$varname
    if [[ -n "$var" ]]; then
        str+="$varname:$var,"
    fi
done
str=${str%,}
printf "%s\n" "$str"

値に応じて印刷しますemp_name:Sid,emp_id:1234,emp_likes:swimming。通常、シェルの文字列変数と数値変数の間に違いはありません。値の周りに引用符を付けるには、別の操作を実行する必要があります。 Bashでは、printf %qまたはを使用して${var@Q}シェル入力に適した形式で値を取得できます。つまり、含まれるすべての引用符も正しくエスケープされます。

複数の独立変数の代わりに連想配列を使用することもできます。

(Bashは変数を整数に変換する必要がありますdeclare -iが、それでも文字列と同じ方法で印刷し、変数が文字列か整数であるかを確認する簡単な方法はないと思います。)

おすすめ記事