26

ASCII テキスト ファイルを考えてみましょう (非シェル スクリプト言語のコードが含まれているとします)。

Text_File.msh:

spool on to '$LOG_FILE_PATH/logfile.log';
login 'username' 'password';
....

これがシェル スクリプトの場合は、次のように実行でき$ sh Text_File.mshます。シェルは変数を自動的に展開します。私がやりたいことは、シェルにこれらの変数を展開させてからText_File_expanded.msh、次のように新しいファイルを作成することです:

Text_File_expanded.msh:

spool on to '/expanded/path/of/the/log/file/../logfile.log';
login 'username' 'password';
....

検討:

$ a=123
$ echo "$a"
123

したがって、技術的には、これでうまくいくはずです:

$ echo "`cat Text_File.msh`" > Text_File_expanded.msh

...しかし、期待どおりに機能せず、出力ファイル while はソースと同じです。

したがって、これを達成する方法がわかりません..私の目標は、非シェルスクリプトに埋め込まれたディレクトリパスを簡単に維持できるようにすることです。これらのスクリプトは UNIX シェルによってコンパイルされないため、UNIX コードを含めることはできません。

4

10 に答える 10

50

この質問は別のスレッドで尋ねられており、これが IMO の最良の回答です。

export LOG_FILE_PATH=/expanded/path/of/the/log/file/../logfile.log
cat Text_File.msh | envsubst > Text_File_expanded.msh

gettextMac の場合は、最初にインストールします。brew install gettext

参照: ファイルからロードされた文字列内の変数を強制的に bash に展開する

于 2015-10-02T18:19:52.553 に答える
11

このソリューションはエレガントではありませんが、機能します。shell_expansion.sh を呼び出すスクリプトを作成します。

echo 'cat <<END_OF_TEXT' >  temp.sh
cat "$1"                 >> temp.sh
echo 'END_OF_TEXT'       >> temp.sh
bash temp.sh >> "$2"
rm temp.sh

その後、次のようにこのスクリプトを呼び出すことができます。

bash shell_expansion.sh Text_File.msh Text_File_expanded.msh
于 2013-01-21T08:23:44.783 に答える
9

Perlソリューションで問題がない場合:

サンプルファイル:

$ cat file.sh
spool on to '$HOME/logfile.log';
login 'username' 'password';

解決:

$ perl -pe 's/\$(\w+)/$ENV{$1}/g' file.sh
spool on to '/home/user/logfile.log';
login 'username' 'password';
于 2013-01-21T08:24:25.080 に答える
8

上記の回答の1つの制限は、どちらも変数を環境にエクスポートする必要があることです。変数を現在のシェルスクリプトに対してローカルにできるようにするために私が思いついたのは次のとおりです。

#!/bin/sh
FOO=bar;
FILE=`mktemp`; # Let the shell create a temporary file
trap 'rm -f $FILE' 0 1 2 3 15;   # Clean up the temporary file 

(
  echo 'cat <<END_OF_TEXT'
  cat "$@"
  echo 'END_OF_TEXT'
) > $FILE
. $FILE

上記の例$FOOでは、コマンドラインで指定されたファイルで変数を置き換えることができます。改善できると確信していますが、これは今のところ私にとってはうまくいきます。

彼らのアイデアに対する以前の両方の回答に感謝します!

于 2013-07-04T05:21:06.497 に答える
2

翻訳したい変数が既知で数が限られている場合は、いつでも自分で翻訳できます。

sed "s/\$LOG_FILE_PATH/$LOG_FILE_PATH/g" input > output

また、変数自体がすでにわかっていると仮定します

于 2014-11-23T16:59:37.600 に答える