كيفية قراءة mutliline المدخلات من stdin في متغير و كيفية طباعة واحد في شل(sh,باش)?
سؤال
ما أريد القيام به هو ما يلي:
- قراءة في خط متعددة المدخلات من
stdin
في متغيرA
- إجراء العمليات المختلفة على
A
- الأنابيب
A
دون أن تفقد محدد الرموز (\n
,\r
,\t
الخ) إلى آخر الأوامر
المشكلة الحالية هي التي لا أستطيع قراءتها مع read
الأمر, لأنه توقف عن القراءة في السطر.
يمكنني قراءة ستدين مع cat
, مثل هذا:
my_var=`cat /dev/stdin`
, لكني لا أعرف كيفية الطباعة.بحيث السطر علامة التبويب وغيرها من المحددات لا تزال هناك.
نموذج بلدي النصي يبدو مثل هذا:
#!/usr/local/bin/bash
A=`cat /dev/stdin`
if [ ${#A} -eq 0 ]; then
exit 0
else
cat ${A} | /usr/local/sbin/nextcommand
fi
المحلول
هذا العمل بالنسبة لي:
myvar=`cat`
echo "$myvar"
ونقلت حول $myvar
هامة.
نصائح أخرى
في باش هناك بديل ؛ man bash
يذكر:
الأمر الاستبدال
$(cat file)
يمكن استبدال أي ما يعادل ولكن بشكل أسرع$(< file)
.
$ myVar=$(</dev/stdin)
hello
this is test
$ echo "$myVar"
hello
this is test
المحملة لا وظيفة
#!/bin/bash
myVar=$(tee)
نعم يعمل بالنسبة لي أيضا.شكرا
myvar=`cat`
هو نفس
myvar=`cat /dev/stdin`
نعم.من bash
رجل الصفحة:
أرفق الأحرف بين علامات اقتباس مزدوجة يحافظ على القيمة الحرفية من كل الشخصيات داخل الاقتباس ، باستثناء $, `, \, و, عندما تاريخ التوسع تمكين !.الشخصيات دولار ، ` تحتفظ معنى خاص داخل علامات اقتباس مزدوجة.
إذا كنت لا يهتمون بالحفاظ على زائدة أسطر في نهاية إخراج استخدام هذا:
myVar=$(cat; echo x)
myVar=${myVar%x}
printf %s "$myVar"
هذا يستخدم خدعة من هنا.
[تحديث]
هذه المهمة سوف معلقة إلى أجل غير مسمى إذا كان هناك أي شيء في الأنابيب...
var="$(< /dev/stdin)"
يمكننا منع هذا على الرغم من القيام مهلة read
على الحرف الأول.إذا كان مرات ، رمز الإرجاع سوف يكون أكبر من 128 و سوف تعرف ستدين الأنابيب (أ.ك.a /dev/stdin
) فارغة.
خلاف ذلك, نحصل على بقية ستدين من قبل...
- الإعداد
IFS
إلى NULL فقطread
الأمر - إيقاف يهرب مع
-r
- القضاء على القراءة محدد مع
-d ''
. - وأخيرا إلحاق ذلك الحرف علينا في البداية
وهكذا...
__=""
_stdin=""
read -N1 -t1 __ && {
(( $? <= 128 )) && {
IFS= read -rd '' _stdin
_stdin="$__$_stdin"
}
}
هذا الأسلوب يتجنب استخدام var="$(command ...)"
استبدال الأوامر التي, تصميم, دائما تجريدها من أي زائدة أسطر.
إذا كان الأمر البديل المفضل ، للحفاظ على زائدة أسطر يمكننا إلحاق واحد أو أكثر من محدد الشخصيات إلى الإخراج داخل $()
ثم تجريدهم من خارج.
على سبيل المثال ( ملاحظة $(parens)
في أول الأمر ، ${braces}
في الثانية )...
_stdin="$(awk '{print}; END {print "|||"}' /dev/stdin)"
_stdin="${_stdin%|||}"