bash: kiểm tra nếu $ WORD được thiết lập


54

Tôi đang tìm kiếm một cấu trúc trong bash, để quyết định xem một biến $WORDcó phải là một trong những từ được xác định hay không. Tôi cần một cái gì đó như thế này:

if "$WORD" in dog cat horse ; then 
    echo yes
else
    echo no
fi

Bash có cấu trúc như vậy? Nếu không, điều gì sẽ là gần nhất?

Câu trả lời:


57

Đây là giải pháp chỉ dành cho Bash (> = phiên bản 3) sử dụng các biểu thức thông thường:

if [[ "$WORD" =~ ^(cat|dog|horse)$ ]]; then
    echo "$WORD is in the list"
else
    echo "$WORD is not in the list"
fi

Nếu danh sách từ của bạn dài, bạn có thể lưu nó trong một tệp (một từ trên mỗi dòng) và làm điều này:

if [[ "$WORD" =~ $(echo ^\($(paste -sd'|' /your/file)\)$) ]]; then
    echo "$WORD is in the list"
else
    echo "$WORD is not in the list"
fi

Một cảnh báo với cách tiếp cận tập tin:

  • Nó sẽ phá vỡ nếu tập tin có khoảng trắng. Điều này có thể được khắc phục bằng một cái gì đó như:

    sed 's/[[:blank:]]//g' /your/file | paste -sd '|' /dev/stdin

Cảm ơn @terdon đã nhắc nhở tôi neo đúng mẫu ^$.


1
shopt -s nocasematchcó thể giúp đỡ nếu bạn muốn tìm kiếm không phân biệt chữ hoa chữ thường.
Skippy le Grand Gourou

1
Lưu ý rằng bạn phải sử dụng [[]]- []không đủ.
Greg Dubicki

tôi đã tìm kiếm một 'oneliner' để xác thực đối số kịch bản của mình và điều này đã hoạt động hoàn hảo. cảm ơn bạn! [[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }
RASG


11

Làm thế nào về:

#!/usr/bin/env bash

WORD="$1"
for w in dog cat horse
do
  if [ "$w" == "$WORD" ] 
  then
      yes=1
      break
  fi
done;
[ "$yes" == "1" ] && echo "$WORD is in the list" || 
                     echo "$WORD is not in the list"

Sau đó:

$ a.sh cat
cat is in the list
$ a.sh bob
bob is not in the list

3
if (echo "$set"  | fgrep -q "$WORD")

1
Cẩn thận mặc dù, điều này sẽ trở thành sự thật nếu $WORDlà trống rỗng, nó sẽ phù hợp nếu WORD=cahay WORD=oghoặc tương tự và tôi giả sử bạn có nghĩa là echo ${set[@]}.
terdon

chỉ cần thêm -w vào grep để tránh một phần từ
BrenoZan

1

Bạn có thể định nghĩa hàm bash cho việc này:

function word_valid() 
{ 
  if [ "$1" != "cat" -a "$1" != "dog" -a "$1" != "horse" ];then
    echo no
  else
    echo yes
  fi
}

Sau đó sử dụng đơn giản như thế này:

word_valid cat

1

tôi đã tìm kiếm một giải pháp 'một dòng' để xác thực đối số tập lệnh của mình và đã sử dụng câu trả lời của Joseph R. ở trên để đưa ra:

[[ "$ARG" =~ ^(true|false)$ ]] || { echo "Argument received invalid value" ; exit 1 ; }


0

Điều này làm việc cho tôi:

#!/bin/bash
phrase=(cat dog parrot cow horse)
findthis=parrot

for item in ${phrase[*]}
do
    test "$item" == "$findthis" && { echo "$findthis found!"; break; }
done

0

Bạn có thể muốn đưa danh sách các từ vào một tệp, trong trường hợp bạn thay đổi danh sách thường xuyên hoặc bạn muốn nó được chia sẻ bởi nhiều tập lệnh. Và bạn có thể cần phải đặt các từ vào một tệp nếu danh sách quá dài để quản lý trong một tập lệnh. Sau đó bạn có thể nói

if fgrep qx "$WORD" word_list

không, tôi không muốn có danh sách của mình trong một tập tin
Martin Vegter

0

Nếu các từ là một danh sách nơi các giá trị được phân tách bằng một dòng mới, bạn có thể làm:

WORDS="$(ls -1)"
if echo "${WORDS}" | grep --quiet --line-regexp --fixed-strings "${WORD}"; then
    echo yes
else
    echo no
fi

0

Bạn có thể sử dụng fgrep để chỉ định tất cả các từ được phép:

if $(echo "$WORD" | fgrep -wq -e dog -e cat -e horse) ; then 
    echo yes
else
    echo no
fi

Các -wlá cờ phù hợp chỉ từ đầy đủ, -qcờ làm cho nó hoạt động âm thầm (vì tất cả chúng ta cần là giá trị trả về cho câu lệnh if để sử dụng), và mỗi -emẫu chỉ định một mô hình cho phép.

fgreplà phiên bản của grep không khớp chuỗi bình thường thay vì khớp regex. Nếu bạn có grep, bạn nên có fgrep, nhưng nếu không, nó giống hệt với việc sử dụng grepvới -Fcờ (vì vậy bạn sẽ chỉ thay thế fgrep -wqở trên bằng grep -Fwq).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.