簡體   English   中英

使用bash腳本中的空格處理Perl命令行參數?

[英]Handling Perl command line arguments with spaces from a bash script?

這讓我瘋了好幾個小時了。

在perl中考慮以下測試腳本:(hello.pl)

#!/usr/bin/perl
print "----------------------------------\n";
$numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments:\n";

foreach $argnum (0 .. $#ARGV) {
    print "$ARGV[$argnum]\n";
}

好吧,它只是打印出給腳本的命令行參數。

例如:

$ ./hello.pl apple pie
----------------------------------
thanks, you gave me 2 command-line arguments:
apple
pie

我可以通過用雙引號括住單詞給腳本一個帶空格的參數:

$ ./hello.pl "apple pie"
----------------------------------
thanks, you gave me 1 command-line arguments:
apple pie

現在我想在shell腳本中使用這個腳本。 我已經設置了這樣的shell腳本:

#!/bin/bash

PARAM="apple pie"
COMMAND="./hello.pl \"$PARAM\""

echo "(command is $COMMAND)"
$COMMAND

我用相同的參數調用hello.pl並轉義引號。 該腳本返回:

$ ./test.sh 
(command is ./hello.pl "apple pie")
----------------------------------
thanks, you gave me 2 command-line arguments:
"apple
pie"

盡管$ COMMAND變量回應命令的方式與第二次從命令行運行perl腳本的方式完全一樣,但這次它不希望將蘋果派視為單個參數。

為什么不?

這看起來像Bash FAQ中描述的問題: 我試圖將命令放在變量中,但復雜的情況總是失敗!

該常見問題解答的答案提出了許多可能的解決方案 - 我希望這是有用的。

2個命令行參數的問題

"apple
pie"

是由於shell擴展,IFS shell變量被設置為具有空格作為值。

printf '%q\n' "$IFS"   # show value of IFS variable

您可以使用xargs&sh -c'... code ...'來模仿/重新啟用普通參數解析。

PARAM="'apple pie'"
printf '%s' "$PARAM" | xargs sh -c './hello.pl "$@"' argv0

另一種選擇可能是寫幾行C(就像在shebang.c中一樣)!

http://www.semicomplete.com/blog/geekery/shebang-fix.html

您應該嘗試eval $COMMAND而不是簡單的$COMMAND

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM