Почему я не могу извлечь первое слово (размера )из вывода команды "du" с ${xx%% *}?

Не используйте echo -eв скриптах, предназначенных для переносимости. Используйте оболочку, созданную -в printf(), которая делает все как предыдущая и по-прежнему остается совместимой между оболочками. Однако для вашего требования, чтобы сохранить многострочную строку -без расширения переменных с префиксом $, используйте здесь -документ

cat << 'EOF' > /home/oragrid/ASM.env
export ORACLE_BASE=/oracle/APP/grid
export ORACLE_HOME=/oracle/APP/grid/12.1.0/grid
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=+ASM
EOF

Это позволит сохранить все содержимое внутри EOFнетронутым, не расширяя переменные внутри.

3
31.01.2021, 15:52
2 ответа

Если вы дважды -заключите свою переменную в кавычки, вы увидите, что явно больше одного пробела. На самом деле это символ табуляции, который вы можете увидеть в некоторых системах более четко с помощью

echo "$x" | cat -e

Таким образом, вы можете сопоставить табуляцию (или пробел )с этой конструкцией, которая удаляет самую длинную последовательность " пробел -или -табуляция, за которой следует что-либо ", связанное с конец строкового значения в$x

echo "${x%%[[:blank:]]*}"
5
18.03.2021, 22:33

xxdили hd— хорошие инструменты для исследования таких вещей. Пример:

$ du sample
32  sample

$ du sample | xxd -g 1
00000000: 33 32 09 73 61 6d 70 6c 65 0a        32.sample.

Если ваша шестнадцатеричная запись заржавела, вы можете использоватьascii:

$ ascii -x
   00 NUL    10 DLE    20      30 0    40 @    50 P    60 `    70 p 
   01 SOH    11 DC1    21 !    31 1    41 A    51 Q    61 a    71 q 
   02 STX    12 DC2    22 "    32 2    42 B    52 R    62 b    72 r 
   03 ETX    13 DC3    23 #    33 3    43 C    53 S    63 c    73 s 
   04 EOT    14 DC4    24 $    34 4    44 D    54 T    64 d    74 t 
   05 ENQ    15 NAK    25 %    35 5    45 E    55 U    65 e    75 u 
   06 ACK    16 SYN    26 &    36 6    46 F    56 V    66 f    76 v 
   07 BEL    17 ETB    27 '    37 7    47 G    57 W    67 g    77 w 
   08 BS     18 CAN    28 (    38 8    48 H    58 X    68 h    78 x 
   09 HT     19 EM     29 )    39 9    49 I    59 Y    69 i    79 y 
   0A LF     1A SUB    2A *    3A :    4A J    5A Z    6A j    7A z 
   0B VT     1B ESC    2B +    3B ;    4B K    5B [    6B k    7B { 
   0C FF     1C FS     2C,    3C <    4C L    5C \    6C l    7C | 
   0D CR     1D GS     2D -    3D =    4D M    5D ]    6D m    7D } 
   0E SO     1E RS     2E.    3E >    4E N    5E ^    6E n    7E ~ 

Из этого вы быстро найдете:

  • 33 => 3
  • 32 => 2
  • 09 => HT или горизонтальная вкладка
  • 73 => с
  • ...

Другими словами. 32<HT>sample. Пробел равен 0x20, и вы бы получили 33 32 20 73..., если бы это было так.

Другим инструментом является od, здесь можно использовать опцию -c,(-aили -ac):

$ printf %s "$x" | od -c
0000000   3   2  \t   s   a   m   p   l   e

Что также дает вам фактическое содержание — если вы правильно цитируете.

Решение состоит в том, чтобы использовать пример @roaima или что-то в строке

$ read -r size name<<< $(du sample)
$ echo "$size"
32

Все зависит от того, что вы хотите. awkтакже, вероятно, является хорошим кандидатом.

2
18.03.2021, 22:33

Теги

Похожие вопросы