Tôi đã viết một truy vấn:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
sql cục bộ - một chuỗi rất dài. Truy vấn không được định dạng. Làm cách nào để chia một chuỗi thành nhiều dòng?
=
bởi các khoảng trắng.
Tôi đã viết một truy vấn:
function print_ui_hosts
{
local sql = "select ........."
print_sql "$ sql"
}
sql cục bộ - một chuỗi rất dài. Truy vấn không được định dạng. Làm cách nào để chia một chuỗi thành nhiều dòng?
=
bởi các khoảng trắng.
Câu trả lời:
Sử dụng read
với một heredoc như hình dưới đây:
read -d '' sql << EOF
select c1, c2 from foo
where c1='something'
EOF
echo "$sql"
read
sẽ có mã thoát là 1 trong tình huống này; nếu điều đó quan trọng ( set -e
ví dụ: bạn đang chạy với ), bạn sẽ muốn thêm một || true
ở cuối dòng đầu tiên.
set -e
thoát khỏi trình bao nếu một lệnh có trạng thái thoát khác 0 "không mong đợi". Bởi "không mong đợi", ý tôi là nó chạy trong bối cảnh mà bạn không xem xét cụ thể trạng thái thoát của nó. false
chẳng hạn, tự nó sẽ thoát khỏi trình bao. false || true
sẽ không, vì bạn dự đoán trạng thái thoát khác 0 bằng cách chỉ định một lệnh khác để chạy nếu lệnh đầu tiên không thành công.
-d ' '
làm ở đây?
read
đừng ngừng đọc khi gặp dòng mới.
chỉ cần chèn dòng mới khi cần thiết
sql="
SELECT c1, c2
from Table1, Table2
where ...
"
shell sẽ tìm kiếm dấu ngoặc kép đóng
sql="SELECT c2, c2
Tôi muốn đưa ra một câu trả lời bổ sung, trong khi những câu khác sẽ đủ trong hầu hết các trường hợp.
Tôi muốn viết một chuỗi trên nhiều dòng, nhưng nội dung của nó cần phải là một dòng.
sql=" \
SELECT c1, c2 \
from Table1, ${TABLE2} \
where ... \
"
Tôi xin lỗi nếu điều này hơi lạc đề (tôi không cần điều này cho SQL). Tuy nhiên, bài đăng này xuất hiện trong số các kết quả đầu tiên khi tìm kiếm các biến shell nhiều dòng và một câu trả lời bổ sung có vẻ phù hợp.
echo "$sql"
thay vì echo $sql
.
Nhờ câu trả lời của dimo414 cho một câu hỏi tương tự , điều này cho thấy giải pháp tuyệt vời của anh ấy hoạt động như thế nào và cho thấy rằng bạn cũng có thể có dấu ngoặc kép và biến trong văn bản một cách dễ dàng:
$ ./test.sh
The text from the example function is:
Welcome dev: Would you "like" to know how many 'files' there are in /tmp?
There are " 38" files in /tmp, according to the "wc" command
#!/bin/bash
function text1()
{
COUNT=$(\ls /tmp | wc -l)
cat <<EOF
$1 Would you "like" to know how many 'files' there are in /tmp?
There are "$COUNT" files in /tmp, according to the "wc" command
EOF
}
function main()
{
OUT=$(text1 "Welcome dev:")
echo "The text from the example function is: $OUT"
}
main
read
không xuất biến (đó là một điều tốt trong hầu hết thời gian). Đây là một giải pháp thay thế có thể được xuất trong một lệnh, có thể bảo toàn hoặc loại bỏ nguồn cấp dữ liệu dòng và cho phép trộn các kiểu trích dẫn khi cần thiết. Hoạt động cho bash và zsh.
oneLine=$(printf %s \
a \
" b " \
$'\tc\t' \
'd ' \
)
multiLine=$(printf '%s\n' \
a \
" b " \
$'\tc\t' \
'd ' \
)
Tôi thừa nhận nhu cầu trích dẫn làm cho điều này trở nên xấu xí đối với SQL, nhưng nó trả lời câu hỏi (được diễn đạt chung hơn) trong tiêu đề.
Tôi sử dụng nó như thế này
export LS_COLORS=$(printf %s \
':*rc=36:*.ini=36:*.inf=36:*.cfg=36:*~=33:*.bak=33:*$=33' \
...
':bd=40;33;1:cd=40;33;1:or=1;31:mi=31:ex=00')
trong một tệp có nguồn từ cả của tôi .bashrc
và .zshrc
.
shell
đang nói chuyện tốt ở đây? Nênbatch
đượcbash
hoặc là bạn thực sự từ Darkside?