3

このスクリプトは、一連の検索用語を受け入れ、Google を検索するための書式設定された URL を返す必要があります。

$ ./google_search.sh albert einstein
https://www.google.com/search?q=albert+einstein

それはうまくいくので、特定のサイトを検索するオプションを追加するか、-sまたは-Sフラグを使用してそのサイトを無視することにしました。

$ ./google_search.sh -s wikipedia.org albert einstein
https://www.google.com/search?q=albert+einstein+site%3Awikipedia.org

これは、スクリプトを初めて実行するときは機能しますが、その後のすべての試行で失敗します。

$ ./google_search.sh -s wikipedia.org albert einstein
https://www.google.com/search?q=albert+einstein
$ ./google_search.sh -s wikipedia.org albert einstein
https://www.google.com/search?q=albert+einstein

新しいターミナル ウィンドウを開くか、ターミナルを再起動すると、この問題が解消され、失敗する前にもう一度試行できるようになります。

スクリプト:

#!/bin/bash

# original source of concatenate_args function by Tyilo:
# http://stackoverflow.com/questions/9354847/concatenate-inputs-in-bash-script
function concatenate_args
{
    string=""
    ignorenext=0
    for a in "$@" # Loop over arguments
    do
        if [[ "${a:0:1}" != "-" && $ignorenext = 0 ]] # Ignore flags (first character is -)
        then
            if [[ "$string" != "" ]]
            then
                string+="+" # Delimeter
            fi
            string+="$a"
        elif [[ $ignorenext = 1 ]]
        then
            ignorenext=0
        else
            ignorenext=1
        fi
    done
    echo "$string"
}

qry="$(concatenate_args "$@")"
glink="https://www.google.com/search?q="

site=""
while getopts :s:S: opt; do
    case $opt in
        s) site="+site%3A$OPTARG" ;; 
        S) site="+-site%3A$OPTARG" ;; 
    esac
done

url=$glink$qry$site

echo $url
# open -a Firefox $url

このスクリプトの信頼性を高めるには、何を変更する必要がありますか?

4

2 に答える 2

5

これは、スクリプトを実行するのではなく、スクリプトを取得しているように動作しています。スクリプトの前にドットとスペースを使用すると、新しいシェルを作成する代わりに、現在のシェル内でスクリプトが 1 行ずつ実行されます。これにより、スクリプト内で変更された環境変数が現在のシェルの環境に漏れる可能性があり、スクリプトの 1 回の実行が次の実行と同じように動作しない可能性があります。

この場合、getopts を使用しているようです。getopts は、呼び出されるたびに環境変数を更新するため、どの引数が検査されているかを追跡できます。スクリプトを 2 回目に実行すると、すべての引数が既に調べられていると見なされるため、引数は無視されてしまいます。

于 2012-12-06T17:31:37.557 に答える
1

簡略化されたスクリプト:

#!/bin/bash
glink="https://www.google.com/search?q="
site=""

# if you're "source"ing, uncomment the following:
# OPTIND=1

while getopts :s:S: opt; do
    case $opt in
        s) site="+site:$OPTARG" ;; 
        S) site="+-site:$OPTARG" ;; 
        ?) echo "invalid option: -$OPTARG" >&2 ;;
    esac
done
shift $((OPTIND - 1))
# the positional parameters are now clear of "-s" and "-S" options

qry=$(IFS="+"; echo "$*")
url=$glink$qry$site
echo "$url"
# open -a Firefox "$url"
于 2012-12-07T00:27:42.533 に答える