使用空格将值/参数传递给Shell脚本

时间:2012-12-14 18:46:14

标签: bash shell unix

下面是一个用于获取2个输入参数值的shell脚本,

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

  2. candidateid

  3. 给出了输出

    string0 asd
    string1 g
    string2 h 
    .
    .
    .
    
    candidateid
    
    .
    .
    .
    

    (&然后两个参数都在Oracle查询中使用)

    现在问题是当我尝试用空格传递第一个参数时,上面的代码失败了。

    例如:/TOM/Process Folders/System Drive/a.jpg

    上面给出的位置应该被视为第一个字符串。 如果我在Double Quotes中给出上述内容,那么它可以正常工作。 但我得到的上述参数没有引号。

    #!/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
    

2 个答案:

答案 0 :(得分:2)

以这种方式调用脚本:

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

您需要在文件名周围加上引号,以便将其视为单个参数。

此外,您不需要明确指定sh,脚本中的#!/bin/bash行告诉操作系统运行bash。

答案 1 :(得分:1)

我猜你真的不必发布所有代码来说你在争论中遇到空格问题。

作为补充,在任何编程语言中,使用数组或将值映射到容器中更有用 - 在bash的情况下使用关联数组 - 而不是创建数十个变量。

修改

对不起正如Barmar指出的那样,我误读了这篇文章,并且我提出了一些真正改变的东西而不是程序的执行。事实是,如果问题出在命令行参数上,那么你必须包含双引号包装它;这是参数的读取方式。

但是,您可以将所有参数读入数组,然后更改IFS,就像您一样。请注意这样一个事实,即您的参数必须由已知的东西以及IFS='#'的使用区分开。