0

以下は、2 つの入力パラメーター値を取得するためのシェル スクリプトです。

  1. asd#@#g#@#h#@#j@#@k

  2. 候補ID

次のような出力が得られます

string0 asd
string1 g
string2 h 
.
.
.

candidateid

.
.
.

(& その後、両方のパラメーターが Oracle クエリで使用されます)

問題は、スペースを含む最初のパラメーターを渡そうとすると、上記のコードが失敗することです。

例えば:/TOM/Process Folders/System Drive/a.jpg

上記の場所は、最初の文字列と見なす必要があります。上記を二重引用符で囲むと、正常に機能します。しかし、私が取得している上記のパラメーターには引用符がありません。

#!/bin/bash
input=$1

input1=$2

IFS='#' read -a arr <<< "${input//#@#/#}"

for((i=0;i<${#arr[@]};i++))
do
        echo "String$i ${arr[i]}"
done

read passportphotos <<< "${arr[0]}"
read academiccertificates <<< "${arr[1]}"
read dateofbirth <<< "${arr[2]}"
read addressproof <<< "${arr[3]}"
read pancard <<< "${arr[4]}"
read pfnominationform <<< "${arr[5]}"
read gratuitynomination <<< "${arr[6]}"
read investmentdeclaration <<< "${arr[7]}"
read resignationletter <<< "${arr[8]}"
read acceptanceoffer <<< "${arr[9]}"
read acceptancecodeofconduct <<< "${arr[10]}"
read medicalnomination <<< "${arr[11]}"
read backgroungverification <<< "${arr[12]}"
read personaldataform <<< "${arr[13]}"

echo $passportphotos
echo $academiccertificates
echo $dateofbirth
echo $addressproof
echo $pancard
echo $pfnominationform
echo $gratuitynomination
echo $investmentdeclaration
echo $resignationletter
echo $acceptanceoffer
echo $acceptancecodeofconduct
echo $medicalnomination
echo $backgroungverification
echo $personaldataform

instant_client="/root/ora_client/instantclient_11_2"
view=`$instant_client/sqlplus -s HRUSER/HRUSER@TOMLWF <<EOF

set heading off

set feedback off

set lines 10000

set pagesize 10000


insert into EMPLOYEEDOCUMENTS VALUES ((SELECT EMPLOYEEID FROM EMPLOYEE WHERE CANDIDATEID='$input1'),'Resume','Doc','$passportphotos','Y','HR',(SELECT SYSDATE FROM DUAL),'HR',(SELECT SYSDATE FROM DUAL),'HR',(SELECT SYSDATE FROM DUAL));
`

echo $view
4

2 に答える 2

2

この方法でスクリプトを呼び出します。

delimiter_new.sh 'company_home/TOM/Proc_joingchecklist_test/Process Instance Documents/Instance.jpg' 14492

単一の引数として扱われるように、ファイル名を引用符で囲む必要があります。

shまた、明示的に指定する必要はありません#!/bin/bash。スクリプト内の行は、OS に bash を実行するように指示します。

于 2012-12-14T19:17:46.933 に答える
1

引数のスペースに問題があると言うために、そのすべてのコードを実際に投稿する必要はなかったと思います。

補足として、どのプログラミング言語でも、多数の変数を作成するよりも、配列を使用したり、コンテナに値をマップしたり (bash の場合は連想配列を使用) する方がはるかに便利です。

編集

申し訳ありません; Barmarが指摘したように、私は投稿を読み違え、プログラムの実行ではなく実際に変更するものを提示しました。実際、問題がコマンド ライン引数にある場合は、引数を二重引用符で囲む必要があります。これが引数の読み取り方法です。

ただし、すべての引数を配列に読み取ってからIFS、同じように を変更できます。の使用法と同様に、引数は既知のもので区切らなければならないという事実に注意してくださいIFS='#'

于 2012-12-14T18:53:23.320 に答える