Bash - 「読み取り」コマンドでユーザー文字列入力を受信しながらEscを押すと、停止して別の操作を実行します。

Bash - 「読み取り」コマンドでユーザー文字列入力を受信しながらEscを押すと、停止して別の操作を実行します。

この機能を機能させるにはどうすればよいですか?

Escユーザー入力を受け付けている間に押すと、スクリプトは終了します。

read -r -p "Enter the filenames: " -a arr

if press Esc; then
     read $round
     mkdir $round
fi

for filenames in "${arr[@]}"; do
   if [[ -e "${filenames}" ]]; then
        echo "${filenames} file exists (no override)"
   else
        cp -n ~/Documents/library/normal.cpp "${filenames}"
   fi
done

Escこのスクリプトでキーをどのように検出できますか?

PS:私は多くのデータを読んだ。
https://www.linuxquestions.org/questions/linux-newbie-8/bash-esc-key-in-a-case-statement-759927/
それら他の変数を使用してください好きな$keyだけread -n1 $key1文字入力

しかしここは文字列や配列がある場合はどうすればよいですか?

答え1

最善の解決策は、ファイルからファイルパスを読み取るか、スクリプトにパラメータとして渡すことです。@terdonが言った。

readEscキーを押して終了する最良の方法は次のとおりです。https://superuser.com/questions/1267984/how-to-exit-read-bash-builtin-by-pressing-the-esc-key/1447324#1447324

別の過酷な方法(Escキーと矢印キーを押すことを区別しない):

#!/usr/bin/env bash


inputString=''

clear() { printf '\033c'; }

ask() {
    clear
    printf '%s' "Enter the filenames: $inputString"
}

ask

while :; do
    read -rN 1 char

    case "$char" in
        $'\e') # Esc (or arrow) key pressed
            clear
            exit
            ;;
        $'\n') # Enter key pressed
            break
            ;;
        $'\177') # Backspace key pressed
            [[ "${#inputString}" -gt 0 ]] &&
                inputString="${inputString::-1}"

            ask
            continue
            ;;
        *)
            ;;
    esac

    [[ -n "$char" ]] &&
        inputString+="$char"
done


array_fromString() {
    local -n array_fromString_a="$1"

    local IFS=$'\n'
    array_fromString_a=(
        $(xargs -n1 <<< "$2")
    )
}


files=()
array_fromString files "$inputString"
echo "Entered filenames: "
printf '%s\n' "${files[@]}"

答え2

スクリプトを変更した方法は次のとおりです。お役に立てば幸いです。

これはうまくいくはずです強く打つ:

#!/bin/bash

# Bind the Escape key to run "escape_function" when pressed.
bind_escape () { bind -x '"\e": escape_function' 2> /dev/null; }

# Unbind the Escape key.
unbind_escape () { bind -r "\e" 2> /dev/null; }

escape_function () {

unbind_escape
echo "escape key pressed"
# command/s to be executed when the Escape key is pressed
exit

}

bind_escape

# Use read -e for this to work.
read -e -r -p "Enter the filenames: " -a arr

unbind_escape

# Commands to be executed when Enter is pressed.
for filenames in "${arr[@]}"; do
   if [[ -e "${filenames}" ]]; then
        echo "${filenames} file exists (no override)"
   else
        cp -n ~/Documents/library/normal.cpp "${filenames}"
   fi
done

関連情報