Es gribu nolasīt failu un saglabāt to mainīgajā, bet man ir nepieciešams saglabāt mainīgo, nevis tikai izdrukāt failu. Kā es to varu izdarīt? Esmu uzrakstījis šo skriptu, bet tas nav gluži tas, kas man vajadzīgs:
#!/bin/sh
while read LINE
do
echo $LINE
done <$1
echo 11111-----------
echo $LINE
Manā skripta skriptu es varu kā parametru norādīt faila nosaukumu, tātad, ja failā ir, piemēram, "aaaa", tas izdrukātu šo:
aaaa
11111-----
Bet tas tikai izdrukā failu uz ekrāna, bet es gribu to saglabāt mainīgajā! Vai ir kāds vienkāršs veids, kā to izdarīt?
Starpplatformu lietojumprogrammā, izmantojot mazāko kopsaucēju sh
:
#!/bin/sh
value=`cat config.txt`
echo "$value"
bash
vai zsh
, lai nolasītu visu failu mainīgajā, neizsaucot cat
:
#!/bin/bash
value=$(<config.txt)
echo "$value"
cat
izsaukšana bash
vai zsh
, lai izdzēstu failu, tiks uzskatīta par Useless Use of Cat.
Ņemiet vērā, ka komandas aizvietošana nav jācitē, lai saglabātu jaunās rindkopas.
Sk: Bash Hacker's Wiki - Komandu aizvietošana - Specialitātes.
Divas svarīgas kļūdas
kas līdz šim citās atbildēs tika ignorēti:
Trailing newline noņemšana no komandu izvēršanas
Šī ir problēma:
value="$(cat config.txt)"
tipa risinājumiem, bet ne uz lasīšanu
balstītiem risinājumiem.
Komandu izvēršana noņem pēdējās jaunās rindkopas:
S="$(printf "a\n")"
printf "$S" | od -tx1
Rezultāti:
0000000 61
0000001
Tādējādi tiek pārtraukta naivā failu lasīšanas metode:
FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"
POSIX risinājums: pievienojiet komandu paplašinājumam papildu simbolu un noņemiet to vēlāk:
S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1
Izejas rezultāti:
0000000 61 0a 0a
0000003
Gandrīz POSIX risinājums: ASCII kodēšana. Skatīt tālāk.
NUL rakstzīmes noņemšana
Nav saprātīga Bash veida, kā saglabāt NUL zīmes mainīgajos.
Tas ietekmē gan paplašināšanas, gan lasīšanas
risinājumus, un es nezinu nevienu labu risinājumu.
Piemērs:
printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1
Rezultāti:
0000000 61 00 62
0000003
0000000 61 62
0000002
Ha, mūsu NUL ir pazudis!
Risinājumi:
ASCII kodēšana. Skatīt tālāk.
izmantot bash paplašinājumu $""
literālus:
S=$"a\0b"
printf "$S" | od -tx1
Darbojas tikai literāliem rakstiem, tāpēc nav noderīgs lasīšanai no failiem.
Iekļūšana no lamatām
Uzglabājiet mainīgajā faila bāzes64 kodētu versiju uuencode un dekodējiet to pirms katras lietošanas reizes:
FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"
Izvades rezultāts:
0000000 61 00 0a
0000003
uuencode un udecode ir POSIX 7, bet nav Ubuntu 12.04 pēc noklusējuma (sharutils
pakete)... Es neredzu POSIX 7 alternatīvu bash procesa <()
aizvietošanas paplašinājumam, izņemot ierakstīšanu citā failā...
Protams, tas ir lēni un neērti, tāpēc domāju, ka īstā atbilde ir: nelietojiet Bash, ja ievades failā var būt NUL zīmes.