問題タブ [variable-expansion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
command - 複雑なコマンド構文を構築するためのbashスクリプト、最初に出力してから実行 - 変数展開の問題
Hive からのローカル テキスト ファイルの抽出を容易にするために scipt を作成したいと考えています。これは基本的に以下のようなコマンドを実行することです:
上記は魅力のように機能しますが、パラメーター化された次のスクリプト (大幅に簡略化されています) を使用して実装するのは非常に問題があることがわかりました。
実行すると、次のようになります。Exception in thread "main" java.lang.NumberFormatException: For input string: "e"
テキストを印刷したり、コマンドを実行したりできるフレーバーがたくさんあることは知っています。たとえば、次の行echo $SQL
は代わりにディレクトリ内のファイルのリストを出力します。
SELECT file1.txt file2.txt file3.txt file4.txt FROM dropme
次のもの:echo "SQL: $SQL"
私が欲しいものだけを提供します:SQL: SELECT * FROM dropme
echo "CMD: $EXTRACMD"
(ほぼ) 実行するコマンドを出力します。ほとんど、\t
展開されている perl コードで見られるように:
CMD: hive -e "SET hive.cli.print.header=true;SELECT * FROM dropme"|perl -pe 'BEGIN{if(defined($_=<ARGV>)){s\w+\.//g;print}}s/(?: |^)\KNULL(?= |$)//g'>extract/outbound/dropme.txt
それでも大丈夫かもしれませんが、私が望むのは、このコマンドを(他の)端末にコピーして貼り付け、一番上に置いたコマンドとして実行できるようにすることです。理想的には、そのコマンドがまったく同じであることを望みます(そうです\t
)
私が持っている最大の問題は、それを実行しようとしたときに発生します(${EXTRACMD}
行)。エラーが発生します:
Exception in thread "main" java.lang.NumberFormatException: For input string: "e"
…など、ここでは bash がすべての「単語」を単一のコマンドとして扱うため、無関係です。実際に何が実行されようとしているのかさえわからないので、私は仮定します(以前の印刷試行は明らかに役に立ちません)
次のような複数のオプションがあることを認識しています。
- コマンド定義文字列内の特殊文字をエスケープする (二重引用符で行ったように)
- echo および
$VAR
、'$VAR'
または"$VAR"
- 「${EXTRACMD}」を試したり、評価したりしています
eval "${EXTRACMD}"
shopt -s extglob
またはの実験set -f
しかし、組み合わせの数が非常に多く、私の小さなbashの経験では、ここで良い練習をする方が良いと感じているので、私の質問は次のとおりです:
(複合/複合シェル) コマンドを最初に出力し、その後、(印刷された出力とまったく同じように) それを実行できるようにする方法はありますか? この場合、正確なコマンドを先頭から出力し、その出力を端末プロンプトに手動でコピーして を押すのと同じ方法で実行しますEnter。
ant - Launch4j 構成ファイルでプロパティ拡張を使用する方法
私は Launch4j を使用しており${dist}
、その構成でプロパティを使用します。
task と it 引数が直接build.xml
ファイルにある場合に機能します。
ただし、Launch4j は独自の xml 構成ファイル<launch4jConfig>
をルート要素として使用できます。
ant.xml で:
my_launch4j_config.xml で:
この場合、${dist}
展開されていない%dist%
か、私が試したすべてのことはありません... launch4j 構成ファイルでプロパティを使用するソリューションはありますか?
bash - ~ の展開を防ぐ
いくつかのファイルをリモート ホストと同期するスクリプトがあります。発行したいコマンドは次の形式です
私のスクリプトは次のようになります。
しかし、~
常に展開され、実際にはコマンドを呼び出します
上記の代わりに。ただし、ホーム ディレクトリへのパスは、サーバー上とローカルで同じであるとは限りません。たとえばsed
、この部分を置き換えるために使用できますが、パスがすべて異なる複数のサーバーに対してこれを行うのは非常に面倒です。~
スクリプトの実行中に展開されずに使用する方法はありrsync
ます~
か?
for-loop - ループ質量の名前を再度ワンライナーに変更するためのコマンド
私はこれで頭がいっぱいです-すでに検索に時間がかかりすぎています-明らかに、CMD変数などの基本を理解していません-そして、いつもそのような頭痛の種になります
なぜこれがうまくいかないのですか?
for %a in (*) do ( set tmpx=%a & echo %tmpx% )
上記のコードは、他のスコープで %tmpx% の値を出力します - そしてそれは常に一定です
はい、setlocal ENABLEDELAYEDEXPANSION を実行します
基本的に、フォルダー内のすべてのファイルの単純な名前を、constantstring_somenameXX.tif から somenameXX.tif に変更する必要があります。つまり、constantstring=0000000005 です。
他の投稿では、 for ループ内の %a には特別な動作があり、そのままでは置換が機能しないことが正しく示唆されていたため、set を使用する必要がありました。
スクリプトや PowerShell を使用したくない - 使用しないことが不可能でない限り
ありがとうございました
powershell - Powershell で一重引用符を介して格納された文字列変数を展開します
としてpowershellパスを構築する必要があるシナリオがあります$RemotePath = '$($env:USERPROFILE)\Desktop\Shell.lnk'
。この変数は、実行する必要があるリモート マシンに渡されます。リモート マシンはこれを文字列変数として受け取ります。文字列を展開して評価するにはどうすればよい$env:USERPROFILE
ですか?
bash - この Bash パス名の展開が行われないのはなぜですか?
Bash の変数展開に苦労しています。次のコードを参照してください。
展開の順序は中かっこ->チルダ->パラメータ->....->パス名$a
ですが、2番目のコマンドと同じようにパス名展開が適用されないのはなぜですか?
[追加した]
空白のエスケープには、次の出力に関して隠された動作がありますか?
java - 文字列で変数にアクセス (宣言/値の代入/値の取得) する方法は?
Java で文字列を使用して名前を指定するにはどうすればよいですか?
このようなことができる方法はありますか?
sql - PERL を使用した SQL ダイアレクトの変換
PostGre と Amazon の RedShift で動作する SQL 製品を Oracle で動作するように移植するという急ぎの仕事があります。(「作業」は現在、「最適に」ではなく「正しく」を意味することに注意してください。)
すべての TABLE は ORM (DBI) を使用して定義されていますが、すべての VIEW は現在インライン SQL として格納されています。
私の希望は、SQL を一種の一般的な意味でカプセル化し、いくつかの既存のツールを使用してそれを方言固有の SQL に変換する比較的簡単な方法があることです。
些細な例:
SELECT CAST(x AS DECIMAL(16,4)) AS foo FROM bah
=>SELECT CAST(x AS NUMBER(16,4)) AS foo FROM bah
それは簡単でした。デプロイ時には「検索と置換の段階」があります。SQL は次のように保存され、デプロイ先の方言に応じて新しい文字列CAST(x AS #DECIMAL#(16,4))
に置き換えます。#DECIMAL#
イライラする例:
SELECT x % y AS modulo FROM foo
=>SELECT MOD(x, y) AS modulo FROM foo
と...
SELECT x / y AS int_div FROM foo
=>SELECT trunc(x / y) AS int_div FROM foo
私は PERL の専門家ではないので、ある種のマクロ展開を行う方法についての指針を探しています。
- SQL は、文字列内のある種のマクロ式とともに格納されます
- 「プロセッサー」は、「方言」および「sql」を含むパラメーターで呼び出されます
- 「方言」パラメーターは、マクロ展開の出力を指示します
ダイアレクトレス SQL:SELECT #DIV(x,y)# AS z FROM foo
方言:RedShift
出力:SELECT x / y AS z FROM foo
方言:Oracle11g
出力:SELECT floor(x / y) AS z FROM foo
サブクエリなどに対処する必要があります。
ダイアレクトレス SQL:SELECT #MOD(x, (SELECT MAX(y) FROM bah))# AS z FROM foo
方言:RedShift
出力:SELECT x % (SELECT MAX(y) FROM bah) AS z FROM foo
方言:Oracle11g
出力:SELECT mod(x, (SELECT MAX(y) FROM bah)) AS z FROM foo
または、「一般的な」SQL を格納し、それを「方言固有の」SQL に変換できる信頼できる方法。