Не используйте 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
нетронутым, не расширяя переменные внутри.
Если вы дважды -заключите свою переменную в кавычки, вы увидите, что явно больше одного пробела. На самом деле это символ табуляции, который вы можете увидеть в некоторых системах более четко с помощью
echo "$x" | cat -e
Таким образом, вы можете сопоставить табуляцию (или пробел )с этой конструкцией, которая удаляет самую длинную последовательность " пробел -или -табуляция, за которой следует что-либо ", связанное с конец строкового значения в$x
echo "${x%%[[:blank:]]*}"
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 ~
Из этого вы быстро найдете:
Другими словами. 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
также, вероятно, является хорошим кандидатом.