11

変数の最初の文字を取得しようとしていますが、不適切な置換エラーが発生します。誰でも私がそれを修正するのを助けることができますか?

コードは次のとおりです。

while IFS=$'\n' read line
do
  if [ ! ${line:0:1} == "#"] # Error on this line
  then
    eval echo "$line"
    eval createSymlink $line
  fi
done < /some/file.txt

私は何か間違ったことをしていますか、それとももっと良い方法がありますか?

- 編集 -

リクエストに応じて - /some/file.txt に保存されているサンプル入力を次に示します。

$MOZ_HOME/mobile/android/chrome/content/browser.js
$MOZ_HOME/mobile/android/locales/en-US/chrome/browser.properties
$MOZ_HOME/mobile/android/components/ContentPermissionPrompt.js
4

4 に答える 4

16

変数の最初の文字を取得するには、次のように言う必要があります。

v="hello"
$ echo "${v:0:1}"
h

ただし、コードに構文エラーがあります。

[ ! ${line:0:1} == "#"]
#                     ^-- missing space

したがって、これはトリックを行うことができます:

$ a="123456"
$ [ ! "${a:0:1}" == "#" ] && echo "doesnt start with #"
doesnt start with #
$ a="#123456"
$ [ ! "${a:0:1}" == "#" ] && echo "doesnt start with #"
$ 

また、次のようにすることもできます。

$ a="#123456"
$ [ "$(expr substr $a 1 1)" != "#" ] && echo "does not start with #"
$ 
$ a="123456"
$ [ "$(expr substr $a 1 1)" != "#" ] && echo "does not start with #"
does not start with #

アップデート

あなたの更新に基づいて、これは私にはうまくいきます:

while IFS=$'\n' read line
do
  echo $line
  if [ ! "${line:0:1}" == "#" ] # Error on this line
  then
    eval echo "$line"
    eval createSymlink $line
  fi
done < file
于 2013-07-18T12:44:54.863 に答える
4

不足しているスペースを追加すると(fedorquiの回答で提案されているように;))うまくいきます。

代替方法/構文

文字列の最初の文字をチェックしたい場合、Bashで行うことは次のとおりです

if [[ $line != "#"* ]]

の右側で==は、引用部分は文字どおりに扱われます*が、 は任意の文字列のワイルドカードです。

For more information, see the last part of Conditional Constructs of Bash reference manual:

「==」および「!=」演算子が使用されている場合、演算子の右側の文字列はパターンと見なされ、パターン マッチングで後述するルールに従って一致します。

正しいシェルを使用していることを確認する

構文に問題がない (そして他の人にとっては正常に動作する) にもかかわらず、 「 Bad replacement error」や「[[: not found」 (コメントを参照)などのエラーが発生する場合は、間違ったシェルを使用している可能性があります (つまり、バッシュではありません)。

したがって、Bash を使用してスクリプトを実行していることを確認するには、次のいずれかを行います。

  • スクリプトを実行可能にし、適切なシバンを使用します。#!/bin/bash
  • または経由で実行しますbash my_script

また、shは必ずしもbashであるとは限らないことに注意してください。ダッシュ(Ubuntu など) または単純な Bourne シェルの場合もあります。

于 2013-07-18T13:20:45.503 に答える