Bashスクリプトリバースライン

Bashスクリプトリバースライン

だから私は入力行を反転するためにこのスクリプトを見つけました。

#! /bin/bash  
input="${1}"  
reverse=""  
len=${#input}  
for(( i=${len}-1; i>=0; i-- ))  
do  
reverse="$reverse${input:${i}:1}"  
done  
echo "$reverse"  

#inputとforループの機能を説明できる人はいますか?

答え1

単純化すると、スクリプトは次のようになります。

#! bin/bash

input="${1}"    reverse=""

for   (( i=0; i<${#input}; i++ ))
do    reverse="${input:${i}:1}$reverse"
done
echo   "$reverse"

上記のコードを:というファイルに入れてscript.sh実行を許可するとしますchmod u+x script.sh。これにより、次のコマンドが機能します。

$ ./script.sh 0123456789
9876543210

${#input}の値は入力された文字の長さです。
ループは最初から最後まで文字単位で進行します。
各文字を選択するために、スクリプトは「サブストリング拡張」と呼ばれるbashツールを使用します。
引用符man bash(を入力してアクセスすることもできますman bash):

${パラメータ:オフセット:長さ}部分
文字列拡張。 offset で指定された文字から引数の最大文字長まで拡張されます。

これはi、その位置の各文字を順番に選択して変数の文字列を再生成することを意味しますreverse

しかし、これを行うためにループやカラフルなコーディングは必要ありません。この単純な行は同じことをします:

$ echo "0123456789" | rev
9876543210

答え2

${#str}$ str値の長さ。バラよりシェルパラメータ拡張bashのマニュアルから。

for ((i=j-1; i>=0; i--))bashの算術構文を使用するCに似たforループです。バラよりループ構造マニュアルに

答え3

  1. ${#input}はの文字数です$input。時には何かを見るときに#「数字」を考えなければなりません。
  2. 本当に明らかではないか?ループはfor、最後から最初まで、一度に1文字ずつ繰り返されます。$inputたとえば、isの場合、ループは$input、、、、、、、unix tmおよびfor文字 を検索して追加します。mtxinureverse
  3. 最初の行は次のようになります。#!/bin/bashYou are Missing one です。/

答え4

簡単ですgetopts。は、文字列を文字ごとに分割し、出力変数からその文字を読み取ることができるAPIを提供するだけです。

input='some string or something' output= OPTIND=1
while  getopts : na "-$input"
do     output=$OPTARG$output
done;  echo "$output"

gnihtemos ro gnirts emos

何も計算したりインデックスを作成したりする必要はありません。getopts完了後すぐに戻ってもループは終了します。それは簡単です。

関連情報