echo $ VARはサブシェルに変数値を割り当てる良い方法ですか? (ネストされた bash 関数)

echo $ VARはサブシェルに変数値を割り当てる良い方法ですか? (ネストされた bash 関数)

私はBASHプログラマーではなく、スクリプトを書く必要があるたびに宝くじです。

はじめにWindowsコンピュータから両方のモニタをキャプチャして撮影した複数のスクリーンショットがあります。私はそれらをサブフォルダに整理し、その中の画像を切り取る一般的な方法が欲しいです。ところで、Windowsで生成されたファイル名、つまりスペースと括弧が気に入らないので、これらの文字を削除したいと思います。

上記の状況は、サブフォルダー内のファイルにジョブを適用する必要があるいくつかの状況の1つにすぎません。私はファイルに対して実行する操作に基づいてスクリプトを設定します。

今のポイントは次のとおりです。スクリプトを書くときは普遍的であることを望んでいるので、関数が他のスクリプト言語のように動作するようにし、必ずしも必要でない限り、グローバル変数を使用しないようにします。

今のポイントは次のとおりです。最後に、文字列を変数に割り当てる必要があるため、サブシェルで "echo -n"を使用し、文字列がスペースやその他の文字で構成されるというサブシェルでechoを使用する方法について読みました。特殊文字変数に割り当てられた反対の説明。

以下の3つの機能を1つずつテストしてみましたが、正常に動作しました。これは、必要に応じて関数自体の値を強制的に変換することを意味します。

3番目の項目に入れ子にした後に私が知っている唯一のことは、サブシェルで変数をエコーし​​、出力をキャプチャするこの手法を使用しない限り、決して機能しないことです。一番下の1つの変数を除いて。

trim_weird_char () {
#  set +x
  local _bn="$(basename "$1")"
#  echo "[twc bn] $_bn"
  local _dn="$(dirname "$1")"
#  echo "[twc dn] $_dn"
  local _fn="$(echo -n $_bn | tr -d ' ' | tr -d '(' | tr -d ') ')"
#  echo "[twc fn] $_fn"
  local _ifn="$(echo -n "${_dn}"/"${_bn}")"
  local _dfn="$(echo -n "${_dn}"/"${_fn}")"
  mv "$_ifn" "$_dfn"
  echo "$_dfn"
#  set -x
}

crop_img() {
# set +x
  #$1 = image
  #$2 = resize
  #$3 = string to add in the output filename before the extension
  local _img="$(echo -n "$1")"; # we want the file name and hence we remove the extension by NOT being GREEDY with the removal
  local _fn="$(echo -n "${_img%.*}")"
  local _ext="$(echo -n "${_img##*.}")"; # we want the extension and hence we remove what comes before by being GREEDY with the removal
  local _dfn="$(echo -n "${_fn}${3}.${_ext}")"
  convert "$_img" -crop "$2" "$_dfn"
  echo "$(echo -n "$_dfn")"
}

crop_smartbe () {
# set -x
# ls -la | awk '{print $5}'
  echo -n "Trimming name for $1..."
  local _img="$(trim_weird_char "$1")"
  echo "done: $_img"
  echo -n "Cropping $_img to... "
  local _s="$(ls -la "$_img" | awk '{print $5}')"
  local _dfn="$(echo -n $(crop_img "$_img" "1080x1920+0+0" "_cropped"))"
  local _s_img=$(ls -la "$_dfn" | awk '{print $5}')
  echo "$_dnf done: size from $_s to $_s_img"
}

私のテスト機能のファイル名は次のとおりです。 (上記のスクリプトを入手しました)

gadger@brunas:/brunas/expenses/2020/Demandes de reimbursement/Demandes$ crop_smartbe Full/1261597\ -\ Frais\ Internet\ -\ 1er\ sémestre/Screenshot\ \(142\).png
Trimming name for Full/1261597 - Frais Internet - 1er sémestre/Screenshot (142).png...done: Full/1261597 - Frais Internet - 1er sémestre/Screenshot142.png
Cropping Full/1261597 - Frais Internet - 1er sémestre/Screenshot142.png to...  done: size from 292631 to 100694

これを行うには(crop_smartbeから)

local _dfn="$(echo -n $(crop_img "$_img" "1080x1920+0+0" "_cropped"))"
...
echo "$_dnf done: size from $_s to $_s_img"

echo -nテクノロジを使用しても、$_dnfはまだ正しく割り当てられていません。

echo関数を削除するとスクリプトが中断されることを当然考えると、printfを好むべきでしょうか?それとも、エコーを使用する必要がない別の方法でスクリプトを再構築する必要がありますか?もしそうなら?

ありがとう、アレックス

ベストアンサー1

おすすめ記事