Bash:如何检查一个变量是否包含另一个变量的字符串?

Ita*_*not 2 bash shell if-statement

为了简化在我公司的 NIS 服务器中创建新用户的过程,我编写了以下脚本:

#!/bin/bash
# This script will simplicate NIS user management.
# You will not be able to change password or delete users peeradmin and root through this script.
# Written by Itai Ganot 2014.

# Variables
USER=$1
GREP="/bin/grep"
PASSWDFILE="/etc/passwd"
YPPASSWD="/usr/bin/yppasswd"
USERDEL="/usr/sbin/userdel"
USERADD="/usr/sbin/useradd"
PASSWD="/usr/bin/passwd"
YPCAT="/usr/bin/ypcat passwd.byname"


# Functions
function usage {
echo -e "Usage: $0 <username to manage>"
}

function updatenis {
echo -e "\e[36m #===#  Uptdating NIS database... \e[0m"
cd /var/yp && make
}

# Script
if [ -z "$USER" ]; then
usage
exit 1
fi
if [ "$(id -u)" != "0" ]; then
echo -e "Run as root!"
exit 1
fi
"$GREP" -q "$USER" "$PASSWDFILE"
if [ "$?" = "0" ]; then
    echo -e "\e[36m #===#  User already exists \e[0m"
    echo -e "\e[36m #===#  How would you like to continue? \e[0m"
    USERID=$(id -u $USER)
    select CHOICE in 'Change user password' 'Remove user' 'View user' 'Exit'; do
        case $CHOICE in
        "Change user password")
        if [[ "$USER" = "peeradmin" || "$USER" = "root" ]]; then # Defense against changing root or peeradmin password
                        echo -e "\e[36m #===#  User $USER should never be edited! \e[0m"
                        exit 1
                        fi

        echo -e "\e[36m #===#  Provide root password for NIS server... \e[0m"
        "$YPPASSWD" "$USER"
        break
        ;;
        "Remove user")
            if [[ "$USER" = "peeradmin" || "$USER" = "root" ]]; then # Defense against deletion of user root or peeradmin.
            echo -e "\e[36m #===#  User $USER should never be edited! \e[0m"
            exit 1
            fi
        read -r -p "Remove home directory and mail? [y/n] " ANSWER1
        if [[ "$ANSWER1" = [Yy] ]]; then
        "$USERDEL" -r "$USER"
        updatenis
        echo -e "\e[36m #===#  User $USER has been deleted along with the user's home folder and mail \e[0m"
        break
        else
        "$USERDEL" "$USER"
        echo -e "\e[36m #===#  User $USER has been deleted \e[0m"
        updatenis
        break
        fi
        ;;
        "View user")
        echo -e "\e[36m #===# Displaying user $USER \e[0m"
        $YPCAT | $GREP "$USER"
        break       
        ;;
        "Exit")
        echo -e "\e[36m #===#  Exiting, No changes done.  \e[0m"
        exit 0
        ;;
        esac
    done
else
    read -r -p "User doesn't exist, would you like to add it? [y/n] " ANSWER2
    if [[ "$ANSWER2" = [Yy] ]]; then
        echo -e "\e[36m #===#  Collecting required information... \e[0m"
        sleep 2
        LASTUID=$(tail -n 1 $PASSWDFILE | awk -F: '{print $3}')
        NEXTUID=$(( LASTUID + 1 ))
        $USERADD -g users $USER -u $NEXTUID
        echo -e "\e[36m #===#  Set password for the new user \e[0m"
        $PASSWD $USER
        updatenis
        read -r -p "Would you like to test the creation of the user? [y/n] " ANSWER3
            if [[ "$ANSWER3" = [Yy] ]]; then
            $YPCAT | $GREP "$USER"
                if [ "$?" = "0" ]; then
                echo -e "\e[36m #===#  User $USER created successfully!  \e[0m"
                fi
            fi
    elif [[ "$ANSWER2" = [Nn] ]]; then
        echo -e "\e[36m #===#  Exiting, no changes done. \e[0m"
        exit 0
    fi
fi
Run Code Online (Sandbox Code Playgroud)

我想让脚本公开,这样我就可以与一些社区分享它,但是我很难完成一些特定的事情。我想定义一个名为 PROTECTEDUSERS 的新变量并为其分配一个或多个用户名。例子:

PROTECTEDUSERS="root peeradmin"
Run Code Online (Sandbox Code Playgroud)

然后,在相关行中:

if [[ "$USER" = "peeradmin" || "$USER" = "root" ]];
Run Code Online (Sandbox Code Playgroud)

我希望该行包含新创建的变量。我试过这个:

if [[ "*$USER*" =~ "$PROTECTEDUSERS" ]]; then...
Run Code Online (Sandbox Code Playgroud)

但它不起作用,这甚至是可能的事情吗?我相信这只是不知道该怎么做,请帮助。

提前致谢

Cyr*_*rus 5

if [[ "$PROTECTEDUSERS" =~ $USER ]]; then
Run Code Online (Sandbox Code Playgroud)

更新以不匹配“admin”等子字符串:

if [[ "$PROTECTEDUSERS" =~ (^| )$USER($| ) ]]; then
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 5

您正在反向使用 glob,请==在 bash 中使用此条件:

if [[ "$PROTECTEDUSERS" == *"$USER"* ]]; then...
Run Code Online (Sandbox Code Playgroud)

仅在比较的 RHS 上支持glob 模式