Как работает IFS в Bash? - PullRequest
       34

Как работает IFS в Bash?

1 голос
/ 31 марта 2011
#!/bin/bash
# This question is from advanced bash scripting guide section 5.1

echo
var="'(]\\{}\$\""
IFS='\'
echo $var

    # output is '(] {}$"     
    # \ converted to space. Why?

echo "$var"      

    # output is '(]\{}$"      
    # special meaning of \ used, \ escapes \ $ and " RIGHT?

echo
var2="\\\\\""
echo $var2       

    # output is   "         
    # \ converted to space. Why?

echo

    # But ... var2="\\\\"" is illegal. Why?

var3='\\\\'
echo "$var3"     # \\\\

    # Strong quoting works, though. Why?

1 Ответ

3 голосов
/ 31 марта 2011
IFS='\'
echo $var        

    # o/p is '(] {}$"     

    # \ converted to space. Why?

Поскольку вы сказали оболочке, что обратная косая черта является разделителем полей, и поскольку вы не указали $var при выводе его, он подвергся разбиению слов на основе IFS.

echo "$var"      

    # o/p is '(]\{}$"      
    # special meaning of \ used, \ escapes \ $ and " RIGHT ?

Здесь вы процитировали $var и, таким образом, разбиение слов не будет выполнено. Ваш вывод в точности соответствует тому, что вы сказали, что оболочка var была равна. т.е. '(]\{}$"

var2="\\\\\""

echo $var2       

    # o/p is   "        
    # \ converted to space. Why?

см. Первый ответ

# But ... var2="\\\\"" is illegal. Why?

Поскольку каждая пара обратных слешей составляет буквальный обратный слеш, и обратного слеша не осталось, чтобы вырваться из второй двойной кавычки. Оболочка не знает, что делать с 3 двойными кавычками.

echo "$var3"     # \\\\

    # Strong quoting works, though. Why ?

См. Второй ответ о разбиении слов

Обратите внимание , что вы также можете использовать строковый литерал синтаксиса $'' vis var=$'\'(]\{}$"', который потребует от вас только экранирования одинарной кавычки

...