9

ゴール

ZSHスクリプトでは、特定の引数について、最初の文字列と残りの文字列を取得したいと考えています。

たとえば、スクリプトに名前が付けられている場合test

sh test hello

hとを抽出することになっていelloます。

ZSH マニュアル

http://zsh.sourceforge.net/Doc/zsh_a4.pdf

言います:

添字付けは配列以外の値に対しても実行できます。この場合、添字は抽出する部分文字列を指定します。たとえば、FOO が 'foobar' に設定されている場合、'echo $FOO[2,5]' は 'ooba' を出力します。

Q1

という名前のファイルにシェルスクリプトを書きました。test

echo $1
echo $1[1,1]

ターミナル:

$ sh test hello
hello
hello[1,1]

結果は失敗します。コードの何が問題になっていますか?

Q2

また、n から最後まで subString を抽出する方法もわかりません。おそらく、正規表現で分割された配列を使用する必要がありますか?

編集:Q3

これは別の質問かもしれませんので、新しいスレッドを開始するのが適切であれば、そうします。

@skishore に感謝します ここにさらなるコードがあります

#! /bin/zsh

echo $1

ARG_FIRST=`echo $1 | cut -c1`
ARG_REST=`echo $1 | cut -c2-`
echo ARG_FIRST=$ARG_FIRST
echo ARG_REST=$ARG_REST

if $ARG_FIRST = ""; then
  echo nullArgs
else
  if $ARG_FIRST = "@"; then
    echo @Args
  else
    echo regularArgs
  fi
fi

文字列の値を文字列と比較する方法がわかりませんが、特定の引数についてhello

結果:

command not found: h

コードの何が問題になっていますか?

EDIT2:

私が正しく見つけたもの

#! /bin/zsh

echo $1

ARG_FIRST=`echo $1 | cut -c1`
ARG_REST=`echo $1 | cut -c2-`
echo ARG_FIRST=$ARG_FIRST
echo ARG_REST=$ARG_REST

if [ $ARG_FIRST ]; then
  if [ $ARG_FIRST = "@" ]; then
    echo @Args
  else
    echo regularArgs
  fi
else
  echo nullArgs
fi

EDIT3:

全体の結果として、これが私がこの質問で行ったことです。

https://github.com/kenokabe/GitSnapShot

GitSnapShotは、Git コマンドの ZSH シン ラッパーであり、より簡単に使用できます。

4

3 に答える 3

9

次のカット コマンドを使用できます。

echo $1 | cut -c1 
echo $1 | cut -c2-

$()これらの値を変数に割り当てるために使用します。

ARG_FIRST=$(echo $1 | cut -c1)
ARG_REST=$(echo $1 | cut -c2-)
echo ARG_FIRST=$ARG_FIRST
echo ARG_REST=$ARG_REST

バッククォートに置き換えることもできます$()が、前者が推奨され、後者はネスティングの問題により推奨されません。

于 2013-08-12T00:31:48.640 に答える
6

それで、testという名前のファイルにシェルスクリプトを書きました

$ sh test hello

これはzshスクリプトではありません: で呼び出していますがshこれは (ほぼ確実に)bashです。シバン ( #!/bin/zsh) がある場合は、それを実行可能 ( chmod +x <script>) にして実行できます./script。または、 で実行することもできますzsh <script>

結果は失敗します。コードの何が問題になっていますか?

中括弧で囲むことができます:

echo ${1}        # This'll work with or without the braces.
echo ${1[3,5]}   # This works in the braces. 
echo $1[3,5]     # This doesn't work. 

これを実行すると、次のよう./test-script helloになります。

./test-script.zsh hello 
hello
llo
./test-script.zsh:5: no matches found: hello[3,5]

また、n から最後まで subString を抽出する方法もわかりません。おそらく、正規表現で分割された配列を使用する必要がありますか?

表記を使用[n,last]しますが、中かっこで囲みます。変数の長さを決定し、その長さを使用できます。

# Store the length of $1 in LENGTH. 
LENGTH=${#1}
echo ${1[2,${LENGTH}]}  # Display from `2` to `LENGTH`. 

これにより、ello(の 2 番目から最後の文字までを表示hello) が生成されます。

再生するスクリプト:

#!/usr/local/bin/zsh

echo ${1}      # Print the input
echo ${1[3,5]} # Print from 3rd->5th characters of input
LENGTH=${#1}   
echo ${1[2,${LENGTH}]} # Print from 2nd -> last characters of input.

次のカット コマンドを使用できます。

しかし、それは余分な荷物を使用することになりますzsh.単純な操作のために複数のサブシェルを生成することなく、これらすべてを単独で行うことができます.

于 2013-08-13T02:18:29.223 に答える