#!/bin/sh
TMP=$(cd Folder && ls)
for name in $TMP; do
if [[ "${name}" != *"a"* -a ${name} == *"b"* ]] ;then
echo $name
fi
done
「a」はないが「b」の名前を出力しようとしています。私が得るエラーは次のとおりです。
./aufg7.sh: 6: [[: not found
./aufg7.sh: 6: [[: not found
./aufg7.sh: 6: [[: not found
./aufg7.sh: 6: [[: not found
./aufg7.sh: 6: [[: not found
./aufg7.sh: 6: [[: not found
私がここで何を間違っているのか?
ベストアンサー1
印刷するには、Folder
次のものが含まれていません。b
a
zsh
~
とは別に/まさか)グローバル演算子:
#! /bin/zsh -
set -o extendedglob
print -rC1 -- Folder/(*b*~*a*)(N:t)
(削除してくださいN
(nullglob
一致するファイルがない場合はエラーを報告するため)。
(標準構文の一部ではない) この演算子を導入するシェルksh93
とその[[...]]
sh
&
そして)と!(...)
(いいえ)オペレータ:
#! /bin/ksh93 -
(
CDPATH= cd Folder &&
set -- ~(N)@(*b*&!(*a*)) &&
(($# > 0)) &&
printf '%s\n' "$@"
)
kshの演算子も複製するbash
シェルを使用してksh88 glob演算子のサポートを使用し、zshのglob修飾子またはglob演算子といくつかの二重否定(zsh
[[...]]
extglob
nullglob
N
ksh93
~(N)
|
または)達成するそして:
#! /bin/bash -
(
shopt -s extglob nullglob
cd ./Folder &&
set -- !(!(*b*)|*a*) &&
(($# > 0)) &&
printf '%s\n' "$@"
)
標準sh
構文では:
#! /bin/sh -
(
CDPATH= cd Folder || exit
set -- [*]b[*] *b*
[ "$1/$2" = '[*]b[*]/*b*' ] && exit # detect the case where the pattern
# expands to itself because there's
# no match as there's no nullglob
# equivalent in sh
shift
for i do
case $i in
(*a*) ;;
(*) set -- "$@" "$i"
esac
shift
done
[ "$#" -gt 0 ] && printf '%s\n' "$@"
)
cd
読み取り権限はありますが、検索権限がないと使用されている解決策は機能しませんので注意してください。Folder
より一般的には、文字列に他の文字列が含まれているかどうかを確認する方法に関する一般的な質問に答えるには、パターンマッチングを実行する構文を使用することをお勧めしますsh
。ヘルパー機能を使用することもできます。case
sh
contains()
case "$1" in
(*"$2"*) true;;
(*) false;;
esac
次のように使用してください。
if contains foobar o; then
echo foobar contains o
fi
if ! contains foobar z; then
echo foobar does not contain o
fi
if
contains "$file" b &&
! contains "$file" a
then
printf '%s\n' "$file contains b and not a "
fi